UNPKG

@dialpad/dialtone

Version:

Dialpad's Dialtone design system monorepo

1 lines 24 kB
{"version":3,"file":"input.cjs","names":[],"sources":["../../../components/input/input.vue"],"sourcesContent":["<template>\n <div\n ref=\"container\"\n :class=\"[rootClass, 'd-input__root', { 'd-input--hidden': hidden }]\"\n v-bind=\"addClassStyleAttrs($attrs)\"\n data-qa=\"dt-input\"\n >\n <label\n class=\"d-input__label\"\n :aria-details=\"$slots.description || description ? descriptionKey : undefined\"\n data-qa=\"dt-input-label-wrapper\"\n >\n <!-- @slot Slot for label, defaults to label prop -->\n <slot name=\"labelSlot\">\n <div\n v-if=\"labelVisible && label\"\n ref=\"label\"\n data-qa=\"dt-input-label\"\n :class=\"[\n 'd-input__label-text',\n 'd-label',\n labelSizeClasses[size],\n ]\"\n >\n {{ label }}\n </div>\n </slot>\n <div\n v-if=\"hasSlotContent($slots.description) || description || shouldValidateLength\"\n :id=\"descriptionKey\"\n ref=\"description\"\n :class=\"[\n 'd-input__description',\n 'd-description',\n descriptionSizeClasses[size],\n ]\"\n data-qa=\"dt-input-description\"\n >\n <div\n v-if=\"hasSlotContent($slots.description) || description\"\n >\n <!-- @slot Slot for description, defaults to description prop -->\n <slot name=\"description\">{{ description }}</slot>\n </div>\n <div\n v-if=\"shouldValidateLength\"\n data-qa=\"dt-input-length-description\"\n class=\"d-input__length-description\"\n >\n {{ validationProps.length.description }}\n </div>\n </div>\n <div\n :class=\"inputWrapperClasses()\"\n :read-only=\"disabled === true ? true : undefined\"\n >\n <span\n class=\"d-input-icon d-input-icon--left\"\n data-qa=\"dt-input-left-icon-wrapper\"\n @focusout=\"onBlur\"\n >\n <!-- @slot Slot for left icon -->\n <slot\n name=\"leftIcon\"\n :icon-size=\"iconSize\"\n />\n </span>\n <textarea\n v-if=\"isTextarea\"\n ref=\"input\"\n :name=\"name\"\n :disabled=\"disabled\"\n :autocomplete=\"$attrs.autocomplete ?? 'off'\"\n :class=\"inputClasses()\"\n :maxlength=\"shouldLimitMaxLength ? validationProps.length.max : null\"\n data-qa=\"dt-input-input\"\n v-bind=\"removeClassStyleAttrs($attrs)\"\n v-on=\"inputListeners\"\n />\n <input\n v-else\n ref=\"input\"\n :value=\"modelValue\"\n :name=\"name\"\n :type=\"type\"\n :disabled=\"disabled\"\n :autocomplete=\"$attrs.autocomplete ?? 'off'\"\n :class=\"inputClasses()\"\n :maxlength=\"shouldLimitMaxLength ? validationProps.length.max : null\"\n data-qa=\"dt-input-input\"\n v-bind=\"removeClassStyleAttrs($attrs)\"\n v-on=\"inputListeners\"\n >\n <span\n class=\"d-input-icon d-input-icon--right\"\n data-qa=\"dt-input-right-icon-wrapper\"\n @focusout=\"onBlur\"\n >\n <!-- @slot Slot for right icon -->\n <slot\n name=\"rightIcon\"\n :icon-size=\"iconSize\"\n :clear=\"clearInput\"\n />\n </span>\n </div>\n </label>\n <dt-validation-messages\n :validation-messages=\"validationMessages\"\n :show-messages=\"showMessages\"\n :class=\"messagesClass\"\n v-bind=\"messagesChildProps\"\n data-qa=\"dt-input-messages\"\n />\n </div>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport { DESCRIPTION_SIZE_TYPES, VALIDATION_MESSAGE_TYPES } from '@/common/constants';\nimport {\n INPUT_TYPES,\n INPUT_SIZES,\n INPUT_SIZE_CLASSES,\n INPUT_ICON_SIZES,\n INPUT_STATE_CLASSES,\n DESCRIPTION_SIZE_CLASSES,\n LABEL_SIZE_CLASSES,\n} from './input_constants';\nimport {\n getUniqueString,\n getValidationState,\n hasSlotContent,\n removeClassStyleAttrs,\n addClassStyleAttrs,\n} from '@/common/utils';\nimport { DtValidationMessages } from '@/components/validation_messages';\nimport { MessagesMixin } from '@/common/mixins/input';\n\n/**\n * An input field is an input control that allows users to enter alphanumeric information.\n * It can have a range of options and supports single line and multi-line lengths,\n * as well as varying formats, including numbers, masked passwords, etc.\n * @property {Boolean} placeholder attribute\n * @see https://dialtone.dialpad.com/components/input.html\n */\nexport default {\n compatConfig: { MODE: 3 },\n name: 'DtInput',\n\n components: { DtValidationMessages },\n\n mixins: [MessagesMixin],\n\n inheritAttrs: false,\n\n props: {\n /**\n * Name property of the input element\n */\n name: {\n type: String,\n default: '',\n },\n\n /**\n * Type of the input.\n * When `textarea` a `<textarea>` element will be rendered instead of an `<input>` element.\n * @values text, password, email, number, textarea, date, time, file, tel, search, color\n * @default 'text'\n */\n type: {\n type: String,\n default: INPUT_TYPES.TEXT,\n validator: (t) => Object.values(INPUT_TYPES).includes(t),\n },\n\n /**\n * Value of the input\n */\n modelValue: {\n type: [String, Number],\n default: '',\n },\n\n /**\n * Disables the input\n * @values true, false\n */\n disabled: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Label for the input\n */\n label: {\n type: String,\n default: '',\n },\n\n /**\n * Determines visibility of input label.\n * @values true, false\n */\n labelVisible: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Description for the input\n */\n description: {\n type: String,\n default: '',\n },\n\n /**\n * Size of the input, one of `xs`, `sm`, `md`, `lg`, `xl`\n * @values xs, sm, md, lg, xl\n */\n size: {\n type: String,\n default: 'md',\n validator: (t) => Object.values(INPUT_SIZES).includes(t),\n },\n\n /**\n * Additional class name for the input element.\n * Can accept String, Object, and Array, i.e. has the\n * same API as Vue's built-in handling of the class attribute.\n */\n inputClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the input wrapper element.\n * Can accept all of: String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n inputWrapperClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * Additional class name for the root element.\n * Can accept all of: String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n rootClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * The current character length that the user has entered into the input.\n * This will only need to be used if you are using `validate.length` and\n * the string contains abnormal characters.\n * For example, an emoji could take up many characters in the input, but should only count as 1 character.\n * If no number is provided, a built-in length calculation will be used for the length validation.\n */\n currentLength: {\n type: Number,\n default: null,\n },\n\n /**\n * Whether the input will continue to display a warning validation message even if the input has lost focus.\n */\n retainWarning: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Validation for the input. Supports maximum length validation with the structure:\n * `{ \"length\": {\"description\": string, \"max\": number, \"warn\": number, \"message\": string,\n * \"limitMaxLength\": boolean }}`\n */\n validate: {\n type: Object,\n default: null,\n },\n\n /**\n * hidden allows to use input without the element visually present in DOM\n */\n hidden: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: [\n /**\n * Native input event\n *\n * @event input\n * @type {String}\n */\n 'input',\n\n /**\n * Native input blur event\n *\n * @event blur\n * @type {FocusEvent}\n */\n 'blur',\n\n /**\n * Input clear event\n *\n * @event clear\n */\n 'clear',\n\n /**\n * Native input focus event\n *\n * @event focus\n * @type {FocusEvent}\n */\n 'focus',\n\n /**\n * Native input focusin event\n *\n * @event focusin\n * @type {FocusEvent}\n */\n 'focusin',\n\n /**\n * Native input focusout event\n *\n * @event focusout\n * @type {FocusEvent}\n */\n 'focusout',\n\n /**\n * Event fired to sync the modelValue prop with the parent component\n * @event update:modelValue\n */\n 'update:modelValue',\n\n /**\n * Length of the input when currentLength prop is not passed\n *\n * @event update:length\n * @type {Number}\n */\n 'update:length',\n\n /**\n * Result of the input validation\n *\n * @event update:invalid\n * @type {Boolean}\n */\n 'update:invalid',\n ],\n\n data () {\n return {\n isInputFocused: false,\n isInvalid: false,\n defaultLength: 0,\n hasSlotContent,\n isComposing: false,\n justEndedComposition: false,\n };\n },\n\n computed: {\n\n isTextarea () {\n return this.type === INPUT_TYPES.TEXTAREA;\n },\n\n isDefaultSize () {\n return this.size === INPUT_SIZES.DEFAULT;\n },\n\n iconSize () {\n return INPUT_ICON_SIZES[this.size];\n },\n\n isValidSize () {\n return Object.values(INPUT_SIZES).includes(this.size);\n },\n\n isValidDescriptionSize () {\n return Object.values(DESCRIPTION_SIZE_TYPES).includes(this.size);\n },\n\n inputComponent () {\n if (this.isTextarea) {\n return 'textarea';\n }\n\n return 'input';\n },\n\n inputListeners () {\n return {\n compositionstart: () => {\n this.isComposing = true;\n },\n\n compositionend: () => {\n this.isComposing = false;\n this.justEndedComposition = true;\n const val = this.$refs.input.value;\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n // Clear the flag after the current synchronous event processing so\n // Firefox's post-compositionend input event is skipped, but the\n // next real user input (a separate browser task) is not.\n Promise.resolve().then(() => { this.justEndedComposition = false; });\n },\n\n input: async event => {\n if (this.isComposing) return;\n if (this.justEndedComposition) return;\n let val = event.target.value;\n if (this.type === INPUT_TYPES.FILE) {\n const files = Array.from(event.target.files);\n val = files.map(file => file.name);\n }\n this.$emit('input', val);\n this.$emit('update:modelValue', val);\n },\n\n blur: event => {\n this.isInputFocused = false;\n this.onBlur(event);\n },\n\n focus: event => {\n this.isInputFocused = true;\n this.$emit('focus', event);\n },\n\n focusin: event => this.$emit('focusin', event),\n focusout: event => this.$emit('focusout', event),\n };\n },\n\n descriptionKey () {\n return `input-description-${getUniqueString()}`;\n },\n\n inputState () {\n return getValidationState(this.validationMessages);\n },\n\n defaultLengthCalculation () {\n return this.calculateLength(this.modelValue);\n },\n\n validationProps () {\n return {\n length: {\n description: this?.validate?.length?.description,\n max: this?.validate?.length?.max,\n warn: this?.validate?.length?.warn,\n message: this?.validate?.length?.message,\n limitMaxLength: this?.validate?.length?.limitMaxLength ? this.validate.length.limitMaxLength : false,\n },\n };\n },\n\n validationMessages () {\n // Add length validation message if exists\n if (this.showLengthLimitValidation) {\n return this.formattedMessages.concat([this.inputLengthErrorMessage()]);\n }\n\n return this.formattedMessages;\n },\n\n showInputState () {\n return this.showMessages && this.inputState;\n },\n\n inputLength () {\n return this.currentLength ? this.currentLength : this.defaultLengthCalculation;\n },\n\n inputLengthState () {\n if (this.inputLength < this.validationProps.length.warn) {\n return null;\n } else if (this.inputLength <= this.validationProps.length.max) {\n return this.validationProps.length.warn ? VALIDATION_MESSAGE_TYPES.WARNING : null;\n } else {\n return VALIDATION_MESSAGE_TYPES.ERROR;\n }\n },\n\n shouldValidateLength () {\n return !!(\n this.validationProps.length.description &&\n this.validationProps.length.max\n );\n },\n\n shouldLimitMaxLength () {\n return this.shouldValidateLength && this.validationProps.length.limitMaxLength;\n },\n\n showLengthLimitValidation () {\n return (\n this.shouldValidateLength &&\n this.inputLengthState !== null &&\n this.validationProps.length.message &&\n (this.retainWarning || this.isInputFocused || this.isInvalid)\n );\n },\n\n sizeModifierClass () {\n if (this.isDefaultSize || !this.isValidSize) {\n return '';\n }\n\n return INPUT_SIZE_CLASSES[this.inputComponent][this.size];\n },\n\n stateClass () {\n return [INPUT_STATE_CLASSES[this.inputState]];\n },\n },\n\n watch: {\n isInvalid (val) {\n this.$emit('update:invalid', val);\n },\n\n modelValue: {\n immediate: true,\n handler (newValue) {\n if (this.shouldValidateLength) {\n this.validateLength(this.inputLength);\n }\n\n if (this.currentLength == null) {\n this.$emit('update:length', this.calculateLength(newValue));\n }\n\n // Set textarea value programmatically to avoid attribute binding\n // Skip during IME composition to avoid interrupting in-progress input\n if (this.isTextarea && !this.isComposing && this.$refs.input && this.$refs.input.value !== newValue) {\n this.$refs.input.value = newValue;\n }\n },\n },\n },\n\n beforeMount () {\n this.descriptionSizeClasses = DESCRIPTION_SIZE_CLASSES;\n this.labelSizeClasses = LABEL_SIZE_CLASSES;\n },\n\n mounted () {\n // Set initial textarea value programmatically\n if (this.isTextarea && this.$refs.input) {\n this.$refs.input.value = this.modelValue;\n }\n },\n\n methods: {\n removeClassStyleAttrs,\n addClassStyleAttrs,\n inputClasses () {\n return [\n 'd-input__input',\n this.inputComponent === 'input' ? 'd-input' : 'd-textarea',\n {\n [this.stateClass]: this.showInputState,\n 'd-input-icon--left': this.$slots.leftIcon,\n 'd-input-icon--right': this.$slots.rightIcon,\n },\n this.sizeModifierClass,\n this.inputClass,\n ];\n },\n\n inputWrapperClasses () {\n if (this.hidden) {\n return [];\n }\n return [\n 'd-input__wrapper',\n { [this.stateClass]: this.showInputState },\n this.inputWrapperClass,\n ];\n },\n\n calculateLength (value) {\n if (typeof value !== 'string') {\n return 0;\n }\n\n return [...value].length;\n },\n\n inputLengthErrorMessage () {\n return {\n message: this.validationProps.length.message,\n type: this.inputLengthState,\n };\n },\n\n onBlur (e) {\n // Do not emit a blur event if the target element is a child of this component\n if (!this.$refs.container?.contains(e.relatedTarget)) {\n this.$emit('blur', e);\n }\n },\n\n emitClearEvents () {\n this.$emit('input', '');\n this.$emit('clear');\n this.$emit('update:modelValue', '');\n },\n\n blur () {\n this.$refs.input.blur();\n },\n\n focus () {\n this.$refs.input.focus();\n },\n\n select () {\n this.$refs.input.select();\n },\n\n getMessageKey (type, index) {\n return `message-${type}-${index}`;\n },\n\n validateLength (length) {\n this.isInvalid = (length > this.validationProps.length.max);\n },\n\n clearInput () {\n this.$refs.input.value = '';\n this.$refs.input.focus();\n this.emitClearEvents();\n },\n },\n};\n</script>\n"],"mappings":"0bAkJA,IAAK,EAAU,CACb,aAAc,CAAE,KAAM,EAAG,CACzB,KAAM,UAEN,WAAY,CAAE,qBAAA,EAAA,QAAsB,CAEpC,OAAQ,CAAC,EAAA,cAAc,CAEvB,aAAc,GAEd,MAAO,CAIL,KAAM,CACJ,KAAM,OACN,QAAS,GACV,CAQD,KAAM,CACJ,KAAM,OACN,QAAS,EAAA,YAAY,KACrB,UAAY,GAAM,OAAO,OAAO,EAAA,YAAY,CAAC,SAAS,EAAE,CACzD,CAKD,WAAY,CACV,KAAM,CAAC,OAAQ,OAAO,CACtB,QAAS,GACV,CAMD,SAAU,CACR,KAAM,QACN,QAAS,GACV,CAKD,MAAO,CACL,KAAM,OACN,QAAS,GACV,CAMD,aAAc,CACZ,KAAM,QACN,QAAS,GACV,CAKD,YAAa,CACX,KAAM,OACN,QAAS,GACV,CAMD,KAAM,CACJ,KAAM,OACN,QAAS,KACT,UAAY,GAAM,OAAO,OAAO,EAAA,YAAY,CAAC,SAAS,EAAE,CACzD,CAOD,WAAY,CACV,KAAM,CAAC,OAAQ,OAAQ,MAAM,CAC7B,QAAS,GACV,CAOD,kBAAmB,CACjB,KAAM,CAAC,OAAQ,OAAQ,MAAM,CAC7B,QAAS,GACV,CAOD,UAAW,CACT,KAAM,CAAC,OAAQ,OAAQ,MAAM,CAC7B,QAAS,GACV,CASD,cAAe,CACb,KAAM,OACN,QAAS,KACV,CAKD,cAAe,CACb,KAAM,QACN,QAAS,GACV,CAOD,SAAU,CACR,KAAM,OACN,QAAS,KACV,CAKD,OAAQ,CACN,KAAM,QACN,QAAS,GACV,CACF,CAED,MAAO,CAOL,QAQA,OAOA,QAQA,QAQA,UAQA,WAMA,oBAQA,gBAQA,iBACD,CAED,MAAQ,CACN,MAAO,CACL,eAAgB,GAChB,UAAW,GACX,cAAe,EACf,eAAA,EAAA,eACA,YAAa,GACb,qBAAsB,GACvB,EAGH,SAAU,CAER,YAAc,CACZ,OAAO,KAAK,OAAS,EAAA,YAAY,UAGnC,eAAiB,CACf,OAAO,KAAK,OAAS,EAAA,YAAY,SAGnC,UAAY,CACV,OAAO,EAAA,iBAAiB,KAAK,OAG/B,aAAe,CACb,OAAO,OAAO,OAAO,EAAA,YAAY,CAAC,SAAS,KAAK,KAAK,EAGvD,wBAA0B,CACxB,OAAO,OAAO,OAAO,EAAA,uBAAuB,CAAC,SAAS,KAAK,KAAK,EAGlE,gBAAkB,CAKhB,OAJI,KAAK,WACA,WAGF,SAGT,gBAAkB,CAChB,MAAO,CACL,qBAAwB,CACtB,KAAK,YAAc,IAGrB,mBAAsB,CACpB,KAAK,YAAc,GACnB,KAAK,qBAAuB,GAC5B,IAAM,EAAM,KAAK,MAAM,MAAM,MAC7B,KAAK,MAAM,QAAS,EAAI,CACxB,KAAK,MAAM,oBAAqB,EAAI,CAIpC,QAAQ,SAAS,CAAC,SAAW,CAAE,KAAK,qBAAuB,IAAS,EAGtE,MAAO,KAAM,IAAS,CAEpB,GADI,KAAK,aACL,KAAK,qBAAsB,OAC/B,IAAI,EAAM,EAAM,OAAO,MACnB,KAAK,OAAS,EAAA,YAAY,OAE5B,EADc,MAAM,KAAK,EAAM,OAAO,MAAM,CAChC,IAAI,GAAQ,EAAK,KAAK,EAEpC,KAAK,MAAM,QAAS,EAAI,CACxB,KAAK,MAAM,oBAAqB,EAAI,EAGtC,KAAM,GAAS,CACb,KAAK,eAAiB,GACtB,KAAK,OAAO,EAAM,EAGpB,MAAO,GAAS,CACd,KAAK,eAAiB,GACtB,KAAK,MAAM,QAAS,EAAM,EAG5B,QAAS,GAAS,KAAK,MAAM,UAAW,EAAM,CAC9C,SAAU,GAAS,KAAK,MAAM,WAAY,EAAM,CACjD,EAGH,gBAAkB,CAChB,MAAO,qBAAqB,EAAA,iBAAiB,IAG/C,YAAc,CACZ,OAAO,EAAA,mBAAmB,KAAK,mBAAmB,EAGpD,0BAA4B,CAC1B,OAAO,KAAK,gBAAgB,KAAK,WAAW,EAG9C,iBAAmB,CACjB,MAAO,CACL,OAAQ,CACN,YAAa,MAAM,UAAU,QAAQ,YACrC,IAAK,MAAM,UAAU,QAAQ,IAC7B,KAAM,MAAM,UAAU,QAAQ,KAC9B,QAAS,MAAM,UAAU,QAAQ,QACjC,eAAgB,MAAM,UAAU,QAAQ,eAAiB,KAAK,SAAS,OAAO,eAAiB,GAChG,CACF,EAGH,oBAAsB,CAMpB,OAJI,KAAK,0BACA,KAAK,kBAAkB,OAAO,CAAC,KAAK,yBAAyB,CAAC,CAAC,CAGjE,KAAK,mBAGd,gBAAkB,CAChB,OAAO,KAAK,cAAgB,KAAK,YAGnC,aAAe,CACb,OAAO,KAAK,cAAgB,KAAK,cAAgB,KAAK,0BAGxD,kBAAoB,CAMhB,OALE,KAAK,YAAc,KAAK,gBAAgB,OAAO,KAC1C,KACE,KAAK,aAAe,KAAK,gBAAgB,OAAO,IAClD,KAAK,gBAAgB,OAAO,KAAO,EAAA,yBAAyB,QAAU,KAEtE,EAAA,yBAAyB,OAIpC,sBAAwB,CACtB,MAAO,CAAC,EACN,KAAK,gBAAgB,OAAO,aAC5B,KAAK,gBAAgB,OAAO,MAIhC,sBAAwB,CACtB,OAAO,KAAK,sBAAwB,KAAK,gBAAgB,OAAO,gBAGlE,2BAA6B,CAC3B,OACE,KAAK,sBACL,KAAK,mBAAqB,MAC1B,KAAK,gBAAgB,OAAO,UAC3B,KAAK,eAAiB,KAAK,gBAAkB,KAAK,YAIvD,mBAAqB,CAKnB,OAJI,KAAK,eAAiB,CAAC,KAAK,YACvB,GAGF,EAAA,mBAAmB,KAAK,gBAAgB,KAAK,OAGtD,YAAc,CACZ,MAAO,CAAC,EAAA,oBAAoB,KAAK,YAAY,EAEhD,CAED,MAAO,CACL,UAAW,EAAK,CACd,KAAK,MAAM,iBAAkB,EAAI,EAGnC,WAAY,CACV,UAAW,GACX,QAAS,EAAU,CACb,KAAK,sBACP,KAAK,eAAe,KAAK,YAAY,CAGnC,KAAK,eACP,KAAK,MAAM,gBAAiB,KAAK,gBAAgB,EAAS,CAAC,CAKzD,KAAK,YAAc,CAAC,KAAK,aAAe,KAAK,MAAM,OAAS,KAAK,MAAM,MAAM,QAAU,IACzF,KAAK,MAAM,MAAM,MAAQ,IAG9B,CACF,CAED,aAAe,CACb,KAAK,uBAAyB,EAAA,yBAC9B,KAAK,iBAAmB,EAAA,oBAG1B,SAAW,CAEL,KAAK,YAAc,KAAK,MAAM,QAChC,KAAK,MAAM,MAAM,MAAQ,KAAK,aAIlC,QAAS,CACP,sBAAA,EAAA,sBACA,mBAAA,EAAA,mBACA,cAAgB,CACd,MAAO,CACL,iBACA,KAAK,iBAAmB,QAAU,UAAY,aAC9C,EACG,KAAK,YAAa,KAAK,eACxB,qBAAsB,KAAK,OAAO,SAClC,sBAAuB,KAAK,OAAO,UACpC,CACD,KAAK,kBACL,KAAK,WACN,EAGH,qBAAuB,CAIrB,OAHI,KAAK,OACA,EAAE,CAEJ,CACL,mBACA,EAAG,KAAK,YAAa,KAAK,eAAgB,CAC1C,KAAK,kBACN,EAGH,gBAAiB,EAAO,CAKtB,OAJI,OAAO,GAAU,SAId,CAAC,GAAG,EAAM,CAAC,OAHT,GAMX,yBAA2B,CACzB,MAAO,CACL,QAAS,KAAK,gBAAgB,OAAO,QACrC,KAAM,KAAK,iBACZ,EAGH,OAAQ,EAAG,CAEJ,KAAK,MAAM,WAAW,SAAS,EAAE,cAAc,EAClD,KAAK,MAAM,OAAQ,EAAE,EAIzB,iBAAmB,CACjB,KAAK,MAAM,QAAS,GAAG,CACvB,KAAK,MAAM,QAAQ,CACnB,KAAK,MAAM,oBAAqB,GAAG,EAGrC,MAAQ,CACN,KAAK,MAAM,MAAM,MAAM,EAGzB,OAAS,CACP,KAAK,MAAM,MAAM,OAAO,EAG1B,QAAU,CACR,KAAK,MAAM,MAAM,QAAQ,EAG3B,cAAe,EAAM,EAAO,CAC1B,MAAO,WAAW,EAAK,GAAG,KAG5B,eAAgB,EAAQ,CACtB,KAAK,UAAa,EAAS,KAAK,gBAAgB,OAAO,KAGzD,YAAc,CACZ,KAAK,MAAM,MAAM,MAAQ,GACzB,KAAK,MAAM,MAAM,OAAO,CACxB,KAAK,iBAAiB,EAEzB,CACF,gDApmBS,UAAQ,8BACR,MAAM,gSAmER,OAAA,EAAA,EAAA,YAAA,CAhHJ,IAAI,YACH,MAAK,CAAG,EAAA,UAAS,gBAAA,CAAA,kBAAwC,EAAA,OAAM,CAAA,EACxD,EAAA,mBAAmB,EAAA,OAAM,CAAA,CACjC,UAAQ,WAAU,CAAA,CAAA,EAAA,EAAA,EAAA,oBAqGV,QAAA,CAlGN,MAAM,iBACL,eAAc,EAAA,OAAO,aAAe,EAAA,YAAc,EAAA,eAAiB,IAAA,GACpE,UAAQ,4CAgBD,EAAA,OAAA,YAAA,EAAA,KAAA,CAXG,EAAA,cAAgB,EAAA,QAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAUlB,MAAA,OATJ,IAAI,QACJ,UAAQ,iBACP,OAAA,EAAA,EAAA,gBAAK,iCAA0E,EAAA,iBAAiB,EAAA,+BAM9F,EAAA,MAAK,CAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,GAAA,GAAA,CAAA,CAAA,CAIJ,EAAA,eAAe,EAAA,OAAO,YAAW,EAAK,EAAA,aAAe,EAAA,uBAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAuBvD,MAAA,OAtBH,GAAI,EAAA,eACL,IAAI,cACH,OAAA,EAAA,EAAA,gBAAK,wCAA2E,EAAA,uBAAuB,EAAA,QAKxG,UAAQ,yBAGA,EAAA,eAAe,EAAA,OAAO,YAAW,EAAK,EAAA,cAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAIxC,MAAA,EAAA,EAAA,EAAA,EAAA,YAD6C,EAAA,OAAA,cAAA,EAAA,KAAA,EAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAArB,EAAA,YAAW,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,EAAA,oBAAA,GAAA,GAAA,CAGjC,EAAA,uBAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAKF,MANN,GAAA,EAAA,EAAA,iBAKK,EAAA,gBAAgB,OAAO,YAAW,CAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,GAAA,GAAA,CAAA,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,GAAA,GAAA,0BAwDnC,MAAA,CApDH,OAAA,EAAA,EAAA,gBAAO,EAAA,qBAAmB,CAAA,CAC1B,YAAW,EAAA,WAAQ,GAAA,GAAmB,IAAA,8BAYhC,OAAA,CATL,MAAM,kCACN,UAAQ,6BACP,WAAQ,EAAA,KAAA,EAAA,IAAA,GAAA,IAAE,EAAA,QAAA,EAAA,OAAA,GAAA,EAAM,qBAMf,EAAA,OAAA,WAAA,CADC,SAAW,EAAA,SAAQ,CAAA,CAAA,CAAA,GAAA,CAIhB,EAAA,aAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAUN,YAAA,EAAA,EAAA,YAAA,OATA,IAAI,QACH,KAAM,EAAA,KACN,SAAU,EAAA,SACV,aAAc,EAAA,OAAO,cAAY,MACjC,MAAO,EAAA,cAAY,CACnB,UAAW,EAAA,qBAAuB,EAAA,gBAAgB,OAAO,IAAG,KAC7D,UAAQ,kBACA,EAAA,sBAAsB,EAAA,OAAM,EAAA,EAAA,EAAA,YACf,EAAf,eAAc,GAAA,CAAA,CAAA,KAAA,GAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAerB,SAAA,EAAA,EAAA,YAAA,OAXC,IAAI,QACH,MAAO,EAAA,WACP,KAAM,EAAA,KACN,KAAM,EAAA,KACN,SAAU,EAAA,SACV,aAAc,EAAA,OAAO,cAAY,MACjC,MAAO,EAAA,cAAY,CACnB,UAAW,EAAA,qBAAuB,EAAA,gBAAgB,OAAO,IAAG,KAC7D,UAAQ,kBACA,EAAA,sBAAsB,EAAA,OAAM,EAAA,EAAA,EAAA,YACf,EAAf,eAAc,GAAA,CAAA,CAAA,KAAA,GAAA,EAAA,2BAaf,OAAA,CAVL,MAAM,mCACN,UAAQ,8BACP,WAAQ,EAAA,KAAA,EAAA,IAAA,GAAA,IAAE,EAAA,QAAA,EAAA,OAAA,GAAA,EAAM,qBAOf,EAAA,OAAA,YAAA,CAFC,SAAW,EAAA,SACX,MAAO,EAAA,iDAWd,GAAA,EAAA,EAAA,YAAA,CALC,sBAAqB,EAAA,mBACrB,gBAAe,EAAA,aACf,MAAO,EAAA,eACA,EAAA,mBAAkB,CAC1B,UAAQ,oBAAmB,CAAA,CAAA,KAAA,GAAA,CAAA,sBAAA,gBAAA,QAAA,CAAA,CAAA,CAAA,GAAA"}