UNPKG

casc-cesium

Version:

Vue 3.x components for CesiumJS.

1 lines 26.2 kB
{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/ui/btn/index.ts"],"sourcesContent":["import { h, defineComponent, ref, computed, Transition, onBeforeUnmount, getCurrentInstance, ComponentPublicInstance } from 'vue'\nimport type { VNode } from 'vue'\nimport VcIcon from '../icon'\nimport { Spinner as VcSpinner } from '../spinner'\nimport { Ripple } from 'casc-cesium-directives'\nimport useBtn, { useBtnProps } from './use-btn'\nimport { hMergeSlot, hDir } from 'casc-cesium-utils/private/render'\nimport { stop, prevent, stopAndPrevent, listenOpts } from 'casc-cesium-utils/private/event'\nimport { getTouchTarget } from 'casc-cesium-utils/private/touch'\nimport { isKeyCode } from 'casc-cesium-utils/private/key-composition'\nimport { LooseDictionary } from 'casc-cesium-utils/types'\n\nconst { passiveCapture } = listenOpts\n\nlet touchTarget: HTMLElement | null, keyboardTarget: HTMLElement | null, mouseTarget: HTMLElement | null\nexport const btnProps = {\n ...useBtnProps,\n\n percentage: {\n type: Number,\n default: 0\n },\n darkPercentage: Boolean\n}\nexport default defineComponent({\n name: 'VcBtn',\n\n props: btnProps,\n\n emits: ['click', 'keydown', 'touchstart', 'mousedown', 'keyup'],\n\n setup(props, { slots, emit }) {\n const proxy = getCurrentInstance()?.proxy\n\n const { classes, style, innerClasses, attributes, isActionable } = useBtn(props)\n\n const rootRef = ref<HTMLElement>(null)\n const blurTargetRef = ref<HTMLElement>(null)\n\n let localTouchTargetEl: HTMLElement = null,\n avoidMouseRipple,\n mouseTimer\n\n const hasLabel = computed(() => props.label !== void 0 && props.label !== null && props.label !== '')\n\n const ripple = computed(() =>\n props.ripple === false\n ? false\n : {\n // keyCodes: isLink.value === true ? [ 13, 32 ] : [ 13 ],\n keyCodes: 13,\n ...(props.ripple === true ? {} : props.ripple)\n }\n )\n\n const percentageStyle = computed(() => {\n const val = Math.max(0, Math.min(100, props.percentage))\n return val > 0 ? { transition: 'transform 0.6s', transform: `translateX(${val - 100}%)` } : {}\n })\n\n const onEvents = computed(() => {\n if (props.loading === true) {\n return {\n onMousedown: onLoadingEvt,\n onTouchstart: onLoadingEvt,\n onClick: onLoadingEvt,\n onKeydown: onLoadingEvt,\n onKeyup: onLoadingEvt\n }\n } else if (isActionable.value === true) {\n return {\n onClick,\n onKeydown,\n onMousedown,\n onTouchstart\n }\n }\n\n return {}\n })\n\n const directives = computed(() => {\n // if props.disable !== true && props.ripple !== false\n return [[Ripple, ripple.value, void 0, { center: props.round }]]\n })\n\n const nodeProps = computed(() => ({\n ref: rootRef,\n class: 'vc-btn vc-btn-item non-selectable no-outline ' + classes.value,\n style: style.value,\n ...attributes.value,\n ...onEvents.value\n }))\n\n function onClick(e) {\n if (e !== void 0) {\n if (e.defaultPrevented === true) {\n return\n }\n\n const el = document.activeElement\n // focus button if it came from ENTER on form\n // prevent the new submit (already done)\n if (\n props.type === 'submit' &&\n el !== document.body &&\n rootRef.value?.contains(el) === false &&\n // required for iOS and desktop Safari\n el?.contains(rootRef.value) === false\n ) {\n rootRef.value.focus()\n\n const onClickCleanup = () => {\n document.removeEventListener('keydown', stopAndPrevent, true)\n document.removeEventListener('keyup', onClickCleanup, passiveCapture)\n rootRef.value !== null && rootRef.value.removeEventListener('blur', onClickCleanup, passiveCapture)\n }\n\n document.addEventListener('keydown', stopAndPrevent, true)\n document.addEventListener('keyup', onClickCleanup, passiveCapture)\n rootRef.value.addEventListener('blur', onClickCleanup, passiveCapture)\n }\n }\n\n const go = () => {\n // navigateToLink(e)\n }\n\n emit('click', e, go)\n // TODO vue3 - not accounting for e.navigate\n // hasLink.value === true && e.navigate !== false && go()\n }\n\n function onKeydown(e) {\n if (isKeyCode(e, [13, 32]) === true) {\n stopAndPrevent(e)\n\n if (keyboardTarget !== rootRef.value) {\n keyboardTarget !== null && cleanup()\n\n // focus external button if the focus helper was focused before\n rootRef.value?.focus()\n\n keyboardTarget = rootRef.value\n rootRef.value?.classList.add('vc-btn--active')\n document.addEventListener('keyup', onPressEnd, true)\n rootRef.value?.addEventListener('blur', onPressEnd, passiveCapture)\n }\n }\n\n emit('keydown', e)\n }\n\n function onTouchstart(e) {\n if (touchTarget !== rootRef.value) {\n touchTarget !== null && cleanup()\n touchTarget = rootRef.value\n\n localTouchTargetEl = getTouchTarget(e.target)\n localTouchTargetEl?.addEventListener('touchcancel', onPressEnd, passiveCapture)\n localTouchTargetEl?.addEventListener('touchend', onPressEnd, passiveCapture)\n }\n\n // avoid duplicated mousedown event\n // triggering another early ripple\n avoidMouseRipple = true\n clearTimeout(mouseTimer)\n mouseTimer = setTimeout(() => {\n avoidMouseRipple = false\n }, 200)\n\n emit('touchstart', e)\n }\n\n function onMousedown(e) {\n if (mouseTarget !== rootRef.value) {\n mouseTarget !== null && cleanup()\n mouseTarget = rootRef.value\n rootRef.value?.classList.add('vc-btn--active')\n document.addEventListener('mouseup', onPressEnd, passiveCapture)\n }\n\n e.qSkipRipple = avoidMouseRipple === true\n emit('mousedown', e)\n }\n\n function onPressEnd(e) {\n // needed for IE (because it emits blur when focusing button from focus helper)\n if (e !== void 0 && e.type === 'blur' && document.activeElement === rootRef.value) {\n return\n }\n\n if (e !== void 0 && e.type === 'keyup') {\n if (keyboardTarget === rootRef.value && isKeyCode(e, [13, 32]) === true) {\n // for click trigger\n const evt = new MouseEvent('click', e)\n ;(evt as any).qKeyEvent = true\n e.defaultPrevented === true && prevent(evt)\n e.cancelBubble === true && stop(evt)\n rootRef.value?.dispatchEvent(evt)\n\n stopAndPrevent(e)\n\n // for ripple\n e.qKeyEvent = true\n }\n\n emit('keyup', e)\n }\n\n cleanup()\n }\n\n function cleanup(destroying?) {\n const blurTarget = blurTargetRef.value\n\n if (\n destroying !== true &&\n (touchTarget === rootRef.value || mouseTarget === rootRef.value) &&\n blurTarget !== null &&\n blurTarget !== document.activeElement\n ) {\n blurTarget.setAttribute('tabindex', '-1')\n blurTarget.focus()\n }\n\n if (touchTarget === rootRef.value) {\n if (localTouchTargetEl !== null) {\n localTouchTargetEl.removeEventListener('touchcancel', onPressEnd, passiveCapture)\n localTouchTargetEl.removeEventListener('touchend', onPressEnd, passiveCapture)\n }\n touchTarget = localTouchTargetEl = null\n }\n\n if (mouseTarget === rootRef.value) {\n document.removeEventListener('mouseup', onPressEnd, passiveCapture)\n mouseTarget = null\n }\n\n if (keyboardTarget === rootRef.value) {\n document.removeEventListener('keyup', onPressEnd, true)\n rootRef.value !== null && rootRef.value.removeEventListener('blur', onPressEnd, passiveCapture)\n keyboardTarget = null\n }\n\n rootRef.value !== null && rootRef.value.classList.remove('vc-btn--active')\n }\n\n function onLoadingEvt(evt) {\n stopAndPrevent(evt)\n evt.qSkipRipple = true\n }\n\n onBeforeUnmount(() => {\n cleanup(true)\n })\n\n // expose public methods\n Object.assign(proxy, {\n click: onClick\n })\n\n return () => {\n let inner: Array<VNode> = []\n\n props.icon !== void 0 &&\n inner.push(\n h(VcIcon, {\n name: props.icon,\n left: props.stack === false && hasLabel.value === true,\n role: 'img',\n 'aria-hidden': 'true'\n })\n )\n\n hasLabel.value === true && inner.push(h('span', { class: 'block' }, [props.label]))\n\n inner = hMergeSlot(slots.default, inner)\n\n if (props.iconRight !== void 0 && props.round === false) {\n inner.push(\n h(VcIcon, {\n name: props.iconRight,\n right: props.stack === false && hasLabel.value === true,\n role: 'img',\n 'aria-hidden': 'true'\n })\n )\n }\n\n const child = [\n h('span', {\n class: 'vc-focus-helper',\n ref: blurTargetRef\n })\n ]\n\n if (props.loading === true && props.percentage !== void 0) {\n child.push(\n h(\n 'span',\n {\n class: 'vc-btn__progress absolute-full overflow-hidden'\n },\n [\n h('span', {\n class: 'vc-btn__progress-indicator fit block' + (props.darkPercentage === true ? ' vc-btn__progress--dark' : ''),\n style: percentageStyle.value\n })\n ]\n )\n )\n }\n\n child.push(\n h(\n 'span',\n {\n class: 'vc-btn__content text-center col items-center vc-anchor--skip ' + innerClasses.value\n },\n inner\n )\n )\n\n props.loading !== null &&\n child.push(\n h(\n Transition,\n {\n name: 'vc-transition--fade'\n },\n () =>\n props.loading === true\n ? [\n h(\n 'span',\n {\n key: 'loading',\n class: 'absolute-full flex flex-center'\n },\n slots.loading !== void 0 ? slots.loading() : [h(VcSpinner)]\n )\n ]\n : null\n )\n )\n\n return hDir('button', nodeProps.value, child, 'ripple', props.disable !== true && props.ripple !== false, () => directives.value)\n }\n }\n})\n\nexport interface VcBtnProps {\n /**\n * Size in CSS units, including unit name or standard size name (xs|sm|md|lg|xl).\n */\n size?: string | undefined\n /**\n * 1) Define the button native type attribute (submit, reset, button) or 2) render component with <a> tag so you can access events even if disable or 3) Use 'href' prop and specify 'type' as a media tag.\n * Default value: button\n */\n type?: string | undefined\n /**\n * Equivalent to Vue Router <router-link> 'to' property; Superseeded by 'href' prop if used.\n */\n to?: string | any | undefined\n /**\n * Equivalent to Vue Router <router-link> 'replace' property; Superseeded by 'href' prop if used.\n */\n replace?: boolean | undefined\n /**\n * Native <a> link href attribute; Has priority over the 'to' and 'replace' props.\n */\n href?: string | undefined\n /**\n * Native <a> link target attribute; Use it only with 'to' or 'href' props.\n */\n target?: string | undefined\n /**\n * The text that will be shown on the button.\n */\n label?: string | number | undefined\n /**\n * Icon name following VueCesium convention; Make sure you have the icon library installed unless you are using 'img:' prefix.\n */\n icon?: string | undefined\n /**\n * Icon name following VueCesium convention; Make sure you have the icon library installed unless you are using 'img:' prefix.\n */\n iconRight?: string | undefined\n /**\n * Use 'outline' design.\n */\n outline?: boolean | undefined\n /**\n * Use 'flat' design.\n */\n flat?: boolean | undefined\n /**\n * Remove shadow.\n */\n unelevated?: boolean | undefined\n /**\n * Applies a more prominent border-radius for a squared shape button.\n */\n rounded?: boolean | undefined\n /**\n * Use 'push' design.\n */\n push?: boolean | undefined\n /**\n * Applies a glossy effect.\n */\n glossy?: boolean | undefined\n /**\n * Makes button size and shape to fit a Floating Action Button.\n */\n fab?: boolean | undefined\n /**\n * Makes button size and shape to fit a small Floating Action Button\n */\n fabMini?: boolean | undefined\n /**\n * Apply custom padding (vertical [horizontal]); Size in CSS units, including unit name or standard size name (none|xs|sm|md|lg|xl); Also removes the min width and height when set.\n */\n padding?: string | undefined\n /**\n * Color name for component from the css Color Palette.\n */\n color?: string | undefined\n /**\n * Overrides text color (if needed); Color name from the css Color Palette.\n */\n textColor?: string | undefined\n /**\n * Avoid turning label text into caps (which happens by default).\n */\n noCaps?: boolean | undefined\n /**\n * Avoid label text wrapping.\n */\n noWrap?: boolean | undefined\n /**\n * Dense mode; occupies less space.\n */\n dense?: boolean | undefined\n /**\n * Configure material ripple (disable it by setting it to 'false' or supply a config object).\n * Default value: true\n */\n ripple?: boolean | any | undefined\n /**\n * Tabindex HTML attribute value.\n */\n tabindex?: number | string | undefined\n /**\n * Label or content alignment.\n * Default value: center\n */\n align?: 'left' | 'right' | 'center' | 'around' | 'between' | 'evenly' | undefined\n /**\n * Stack icon and label vertically instead of on same line (like it is by default).\n */\n stack?: boolean | undefined\n /**\n * When used on flexbox parent, button will stretch to parent's height.\n */\n stretch?: boolean | undefined\n /**\n * Put button into loading state (displays a QSpinner -- can be overridden by using a 'loading' slot).\n */\n loading?: boolean | undefined\n /**\n * Put component in disabled mode.\n */\n disable?: boolean | undefined\n /**\n * Makes a circle shaped button.\n */\n round?: boolean | undefined\n /**\n * Percentage (0.0 < x < 100.0); To be used along 'loading' prop; Display a progress bar on the background.\n */\n percentage?: number | undefined\n /**\n * Progress bar on the background should have dark color; To be used along with 'percentage' and 'loading' props.\n */\n darkPercentage?: boolean | undefined\n background?: string | undefined\n /**\n * Emitted when component is clicked (activated)\n * @param evt JS event object; If you want to cancel navigation set synchronously 'evt.navigate' to false\n * @param navigateFn When you need to control the time at which the button should trigger the route navigation then set 'evt.navigate' to false and call this function; Useful if you have async work to be done before the actual route navigation\n */\n onClick?: (evt: LooseDictionary, navigateFn: () => void) => void\n}\n\nexport interface VcBtnSlots {\n /**\n * Use for custom content, instead of relying on 'icon' and 'label' props\n */\n default: () => VNode[]\n /**\n * Override the default VcSpinner when in 'loading' state\n */\n loading: () => VNode[]\n}\n\nexport interface VcBtnRef extends ComponentPublicInstance<VcBtnProps> {\n /**\n * Emulate click on VcBtn\n * @param evt JS event object\n */\n click: (evt?: LooseDictionary) => void\n}\n"],"names":["VcIcon","VcSpinner"],"mappings":";;;;;;;;;;;;AASA,MAAM,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC;AACtC,IAAI,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC;AACjC,MAAC,QAAQ,GAAG;AACxB,EAAE,GAAG,WAAW;AAChB,EAAE,UAAU,EAAE;AACd,IAAI,IAAI,EAAE,MAAM;AAChB,IAAI,OAAO,EAAE,CAAC;AACd,GAAG;AACH,EAAE,cAAc,EAAE,OAAO;AACzB,EAAE;AACF,UAAe,eAAe,CAAC;AAC/B,EAAE,IAAI,EAAE,OAAO;AACf,EAAE,KAAK,EAAE,QAAQ;AACjB,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC;AACjE,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;AAChC,IAAI,IAAI,EAAE,CAAC;AACX,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,kBAAkB,EAAE,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;AAC1E,IAAI,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACrF,IAAI,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,IAAI,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;AACpC,IAAI,IAAI,kBAAkB,GAAG,IAAI,EAAE,gBAAgB,EAAE,UAAU,CAAC;AAChE,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AAC1G,IAAI,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,MAAM,KAAK,KAAK,GAAG,KAAK,GAAG;AACnE,MAAM,QAAQ,EAAE,EAAE;AAClB,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM;AAClD,KAAK,CAAC,CAAC;AACP,IAAI,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM;AAC3C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AACrG,KAAK,CAAC,CAAC;AACP,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM;AACpC,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE;AAClC,QAAQ,OAAO;AACf,UAAU,WAAW,EAAE,YAAY;AACnC,UAAU,YAAY,EAAE,YAAY;AACpC,UAAU,OAAO,EAAE,YAAY;AAC/B,UAAU,SAAS,EAAE,YAAY;AACjC,UAAU,OAAO,EAAE,YAAY;AAC/B,SAAS,CAAC;AACV,OAAO,MAAM,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,EAAE;AAC9C,QAAQ,OAAO;AACf,UAAU,OAAO;AACjB,UAAU,SAAS;AACnB,UAAU,WAAW;AACrB,UAAU,YAAY;AACtB,SAAS,CAAC;AACV,OAAO;AACP,MAAM,OAAO,EAAE,CAAC;AAChB,KAAK,CAAC,CAAC;AACP,IAAI,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM;AACtC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACvE,KAAK,CAAC,CAAC;AACP,IAAI,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO;AACtC,MAAM,GAAG,EAAE,OAAO;AAClB,MAAM,KAAK,EAAE,+CAA+C,GAAG,OAAO,CAAC,KAAK;AAC5E,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK;AACxB,MAAM,GAAG,UAAU,CAAC,KAAK;AACzB,MAAM,GAAG,QAAQ,CAAC,KAAK;AACvB,KAAK,CAAC,CAAC,CAAC;AACR,IAAI,SAAS,OAAO,CAAC,CAAC,EAAE;AACxB,MAAM,IAAI,GAAG,CAAC;AACd,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE;AACxB,QAAQ,IAAI,CAAC,CAAC,gBAAgB,KAAK,IAAI,EAAE;AACzC,UAAU,OAAO;AACjB,SAAS;AACT,QAAQ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC;AAC1C,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE;AACtM,UAAU,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChC,UAAU,MAAM,cAAc,GAAG,MAAM;AACvC,YAAY,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;AAC1E,YAAY,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAClF,YAAY,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAChH,WAAW,CAAC;AACZ,UAAU,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;AACrE,UAAU,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAC7E,UAAU,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AACjF,SAAS;AACT,OAAO;AACP,MAAM,MAAM,EAAE,GAAG,MAAM;AACvB,OAAO,CAAC;AACR,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3B,KAAK;AACL,IAAI,SAAS,SAAS,CAAC,CAAC,EAAE;AAC1B,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;AACtB,MAAM,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;AAC3C,QAAQ,cAAc,CAAC,CAAC,CAAC,CAAC;AAC1B,QAAQ,IAAI,cAAc,KAAK,OAAO,CAAC,KAAK,EAAE;AAC9C,UAAU,cAAc,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAC/C,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;AAC/D,UAAU,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;AACzC,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACrF,UAAU,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAC/D,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAC1G,SAAS;AACT,OAAO;AACP,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACzB,KAAK;AACL,IAAI,SAAS,YAAY,CAAC,CAAC,EAAE;AAC7B,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE;AACzC,QAAQ,WAAW,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1C,QAAQ,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;AACpC,QAAQ,kBAAkB,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACtD,QAAQ,kBAAkB,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,aAAa,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAC7H,QAAQ,kBAAkB,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAC1H,OAAO;AACP,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;AAC/B,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM;AACpC,QAAQ,gBAAgB,GAAG,KAAK,CAAC;AACjC,OAAO,EAAE,GAAG,CAAC,CAAC;AACd,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AAC5B,KAAK;AACL,IAAI,SAAS,WAAW,CAAC,CAAC,EAAE;AAC5B,MAAM,IAAI,GAAG,CAAC;AACd,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE;AACzC,QAAQ,WAAW,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC;AAC1C,QAAQ,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;AACpC,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACrF,QAAQ,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AACzE,OAAO;AACP,MAAM,CAAC,CAAC,WAAW,GAAG,gBAAgB,KAAK,IAAI,CAAC;AAChD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC3B,KAAK;AACL,IAAI,SAAS,UAAU,CAAC,CAAC,EAAE;AAC3B,MAAM,IAAI,GAAG,CAAC;AACd,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,aAAa,KAAK,OAAO,CAAC,KAAK,EAAE;AACzF,QAAQ,OAAO;AACf,OAAO;AACP,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE;AAC9C,QAAQ,IAAI,cAAc,KAAK,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;AACjF,UAAU,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACjD,UAAU,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAC/B,UAAU,CAAC,CAAC,gBAAgB,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;AACtD,UAAU,CAAC,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AAC1E,UAAU,cAAc,CAAC,CAAC,CAAC,CAAC;AAC5B,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AAC7B,SAAS;AACT,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACzB,OAAO;AACP,MAAM,OAAO,EAAE,CAAC;AAChB,KAAK;AACL,IAAI,SAAS,OAAO,CAAC,UAAU,EAAE;AACjC,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC;AAC7C,MAAM,IAAI,UAAU,KAAK,IAAI,KAAK,WAAW,KAAK,OAAO,CAAC,KAAK,IAAI,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,QAAQ,CAAC,aAAa,EAAE;AACnK,QAAQ,UAAU,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAClD,QAAQ,UAAU,CAAC,KAAK,EAAE,CAAC;AAC3B,OAAO;AACP,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE;AACzC,QAAQ,IAAI,kBAAkB,KAAK,IAAI,EAAE;AACzC,UAAU,kBAAkB,CAAC,mBAAmB,CAAC,aAAa,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAC5F,UAAU,kBAAkB,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AACzF,SAAS;AACT,QAAQ,WAAW,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAChD,OAAO;AACP,MAAM,IAAI,WAAW,KAAK,OAAO,CAAC,KAAK,EAAE;AACzC,QAAQ,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAC5E,QAAQ,WAAW,GAAG,IAAI,CAAC;AAC3B,OAAO;AACP,MAAM,IAAI,cAAc,KAAK,OAAO,CAAC,KAAK,EAAE;AAC5C,QAAQ,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAChE,QAAQ,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AACxG,QAAQ,cAAc,GAAG,IAAI,CAAC;AAC9B,OAAO;AACP,MAAM,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACjF,KAAK;AACL,IAAI,SAAS,YAAY,CAAC,GAAG,EAAE;AAC/B,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;AAC1B,MAAM,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;AAC7B,KAAK;AACL,IAAI,eAAe,CAAC,MAAM;AAC1B,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AACpB,KAAK,CAAC,CAAC;AACP,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;AACzB,MAAM,KAAK,EAAE,OAAO;AACpB,KAAK,CAAC,CAAC;AACP,IAAI,OAAO,MAAM;AACjB,MAAM,IAAI,KAAK,GAAG,EAAE,CAAC;AACrB,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAACA,IAAM,EAAE;AACpD,QAAQ,IAAI,EAAE,KAAK,CAAC,IAAI;AACxB,QAAQ,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;AAC9D,QAAQ,IAAI,EAAE,KAAK;AACnB,QAAQ,aAAa,EAAE,MAAM;AAC7B,OAAO,CAAC,CAAC,CAAC;AACV,MAAM,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC/C,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE;AAC/D,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAACA,IAAM,EAAE;AAC7B,UAAU,IAAI,EAAE,KAAK,CAAC,SAAS;AAC/B,UAAU,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI;AACjE,UAAU,IAAI,EAAE,KAAK;AACrB,UAAU,aAAa,EAAE,MAAM;AAC/B,SAAS,CAAC,CAAC,CAAC;AACZ,OAAO;AACP,MAAM,MAAM,KAAK,GAAG;AACpB,QAAQ,CAAC,CAAC,MAAM,EAAE;AAClB,UAAU,KAAK,EAAE,iBAAiB;AAClC,UAAU,GAAG,EAAE,aAAa;AAC5B,SAAS,CAAC;AACV,OAAO,CAAC;AACR,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE;AACjE,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;AAC7B,UAAU,KAAK,EAAE,gDAAgD;AACjE,SAAS,EAAE;AACX,UAAU,CAAC,CAAC,MAAM,EAAE;AACpB,YAAY,KAAK,EAAE,sCAAsC,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,GAAG,yBAAyB,GAAG,EAAE,CAAC;AAC5H,YAAY,KAAK,EAAE,eAAe,CAAC,KAAK;AACxC,WAAW,CAAC;AACZ,SAAS,CAAC,CAAC,CAAC;AACZ,OAAO;AACP,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;AAC3B,QAAQ,KAAK,EAAE,+DAA+D,GAAG,YAAY,CAAC,KAAK;AACnG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AACjB,MAAM,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE;AACzD,QAAQ,IAAI,EAAE,qBAAqB;AACnC,OAAO,EAAE,MAAM,KAAK,CAAC,OAAO,KAAK,IAAI,GAAG;AACxC,QAAQ,CAAC,CAAC,MAAM,EAAE;AAClB,UAAU,GAAG,EAAE,SAAS;AACxB,UAAU,KAAK,EAAE,gCAAgC;AACjD,SAAS,EAAE,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAACC,OAAS,CAAC,CAAC,CAAC;AACvE,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;AACjB,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;AACxI,KAAK,CAAC;AACN,GAAG;AACH,CAAC,CAAC;;;;"}