@getforty/widget 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @getforty/widget might be problematic. Click here for more details.
- package/LICENSE +21 -0
- package/README.md +276 -0
- package/dist/index.cjs +456 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +359 -0
- package/dist/index.d.ts +359 -0
- package/dist/index.global.js +456 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +456 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../node_modules/preact/src/constants.js","../node_modules/preact/src/util.js","../node_modules/preact/src/options.js","../node_modules/preact/src/create-element.js","../node_modules/preact/src/component.js","../node_modules/preact/src/diff/props.js","../node_modules/preact/src/create-context.js","../node_modules/preact/src/diff/children.js","../node_modules/preact/src/diff/index.js","../node_modules/preact/src/render.js","../node_modules/preact/src/clone-element.js","../node_modules/preact/src/diff/catch-error.js","../src/utils/emitter.ts","../src/tracking/batcher.ts","../src/api/client.ts","../src/api/events.ts","../src/tracking/session.ts","../src/tracking/retry.ts","../src/utils/throttle.ts","../src/tracking/tracker.ts","../src/tracking/datalayer.ts","../node_modules/preact/hooks/src/index.js","../node_modules/preact/jsx-runtime/src/utils.js","../node_modules/preact/src/constants.js","../node_modules/preact/jsx-runtime/src/index.js","../src/components/Button.tsx","../src/components/Question.tsx","../src/api/forms.ts","../src/i18n/en.ts","../src/i18n/pt-BR.ts","../src/i18n/index.ts","../src/constants.ts","../src/components/Form.tsx","../src/styles/index.ts","../src/api/display.ts","../src/display/handler.ts","../src/widget.ts"],"sourcesContent":["/**\n * @getforty/widget\n * Embeddable feedback widget and event tracking SDK for GetForty\n *\n * Usage:\n * ```typescript\n * import { GetForty } from '@getforty/widget'\n *\n * const widget = await GetForty.init({\n * trackingId: 'gf_xxxxxxxxxxxx',\n * })\n *\n * // Track events\n * widget.track('page_view', { page: '/pricing' })\n *\n * // Identify users\n * widget.identify('user_123', { email: 'user@example.com' })\n *\n * // Show forms programmatically\n * widget.showForm('form-id')\n *\n * // Listen to events\n * widget.on('submit:success', (data) => {\n * console.log('Feedback submitted!', data.responseId)\n * })\n * ```\n */\n\nimport { createWidget } from \"./widget\";\nimport type { WidgetConfig, GetFortyWidgetInstance } from \"./types\";\nimport { VERSION } from \"./constants\";\n\nexport { VERSION };\n\n/**\n * GetForty namespace\n * Main entry point for the widget SDK\n */\nexport const GetForty = {\n /**\n * Initialize the GetForty widget\n * @param config - Widget configuration\n * @returns Promise that resolves to a widget instance\n * @throws Error if trackingId is missing or invalid\n *\n * @example\n * ```typescript\n * const widget = await GetForty.init({\n * trackingId: 'gf_xxxxxxxxxxxx',\n * debug: true, // Enable debug logging\n * })\n * ```\n */\n async init(config: WidgetConfig): Promise<GetFortyWidgetInstance> {\n if (!config) {\n throw new Error(\"[GetForty] Configuration is required\");\n }\n\n if (!config.trackingId) {\n throw new Error(\"[GetForty] trackingId is required in configuration\");\n }\n\n return createWidget(config);\n },\n\n /**\n * Current SDK version\n */\n version: VERSION,\n};\n\n// Type exports for developers\nexport type {\n // Configuration\n WidgetConfig,\n WidgetTheme,\n TranslationStrings,\n\n // Event Tracking\n TrackEventOptions,\n IdentifyOptions,\n TrackedEvent,\n\n // Forms\n FormConfig,\n Question,\n Answer,\n\n // Widget Lifecycle Events\n WidgetEventMap,\n GetFortyWidgetInstance,\n} from \"./types\";\n\n// Default export for script tag usage\nexport default GetForty;\n","/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { EMPTY_ARR } from './constants';\n\nexport const isArray = Array.isArray;\n\n/**\n * Assign properties from `props` to `obj`\n * @template O, P The obj and props types\n * @param {O} obj The object to copy properties to\n * @param {P} props The object to copy properties from\n * @returns {O & P}\n */\nexport function assign(obj, props) {\n\t// @ts-expect-error We change the type of `obj` to be `O & P`\n\tfor (let i in props) obj[i] = props[i];\n\treturn /** @type {O & P} */ (obj);\n}\n\n/**\n * Remove a child node from its parent if attached. This is a workaround for\n * IE11 which doesn't support `Element.prototype.remove()`. Using this function\n * is smaller than including a dedicated polyfill.\n * @param {import('./index').ContainerNode} node The node to remove\n */\nexport function removeNode(node) {\n\tif (node && node.parentNode) node.parentNode.removeChild(node);\n}\n\nexport const slice = EMPTY_ARR.slice;\n","import { _catchError } from './diff/catch-error';\n\n/**\n * The `option` object can potentially contain callback functions\n * that are called during various stages of our renderer. This is the\n * foundation on which all our addons like `preact/debug`, `preact/compat`,\n * and `preact/hooks` are based on. See the `Options` type in `internal.d.ts`\n * for a full list of available option hooks (most editors/IDEs allow you to\n * ctrl+click or cmd+click on mac the type definition below).\n * @type {import('./internal').Options}\n */\nconst options = {\n\t_catchError\n};\n\nexport default options;\n","import { slice } from './util';\nimport options from './options';\nimport { NULL, UNDEFINED } from './constants';\n\nlet vnodeId = 0;\n\n/**\n * Create an virtual node (used for JSX)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component constructor for this\n * virtual node\n * @param {object | null | undefined} [props] The properties of the virtual node\n * @param {Array<import('.').ComponentChildren>} [children] The children of the\n * virtual node\n * @returns {import('./internal').VNode}\n */\nexport function createElement(type, props, children) {\n\tlet normalizedProps = {},\n\t\tkey,\n\t\tref,\n\t\ti;\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref') ref = props[i];\n\t\telse normalizedProps[i] = props[i];\n\t}\n\n\tif (arguments.length > 2) {\n\t\tnormalizedProps.children =\n\t\t\targuments.length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\t// If a Component VNode, check for and apply defaultProps\n\t// Note: type may be undefined in development, must never error here.\n\tif (typeof type == 'function' && type.defaultProps != NULL) {\n\t\tfor (i in type.defaultProps) {\n\t\t\tif (normalizedProps[i] === UNDEFINED) {\n\t\t\t\tnormalizedProps[i] = type.defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn createVNode(type, normalizedProps, key, ref, NULL);\n}\n\n/**\n * Create a VNode (used internally by Preact)\n * @param {import('./internal').VNode[\"type\"]} type The node name or Component\n * Constructor for this virtual node\n * @param {object | string | number | null} props The properties of this virtual node.\n * If this virtual node represents a text node, this is the text of the node (string or number).\n * @param {string | number | null} key The key for this virtual node, used when\n * diffing it against its children\n * @param {import('./internal').VNode[\"ref\"]} ref The ref property that will\n * receive a reference to its created child\n * @returns {import('./internal').VNode}\n */\nexport function createVNode(type, props, key, ref, original) {\n\t// V8 seems to be better at detecting type shapes if the object is allocated from the same call site\n\t// Do not inline into createElement and coerceToVNode!\n\t/** @type {import('./internal').VNode} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops,\n\t\tkey,\n\t\tref,\n\t\t_children: NULL,\n\t\t_parent: NULL,\n\t\t_depth: 0,\n\t\t_dom: NULL,\n\t\t_component: NULL,\n\t\tconstructor: UNDEFINED,\n\t\t_original: original == NULL ? ++vnodeId : original,\n\t\t_index: -1,\n\t\t_flags: 0\n\t};\n\n\t// Only invoke the vnode hook if this was *not* a direct copy:\n\tif (original == NULL && options.vnode != NULL) options.vnode(vnode);\n\n\treturn vnode;\n}\n\nexport function createRef() {\n\treturn { current: NULL };\n}\n\nexport function Fragment(props) {\n\treturn props.children;\n}\n\n/**\n * Check if a the argument is a valid Preact VNode.\n * @param {*} vnode\n * @returns {vnode is VNode}\n */\nexport const isValidElement = vnode =>\n\tvnode != NULL && vnode.constructor === UNDEFINED;\n","import { assign } from './util';\nimport { diff, commitRoot } from './diff/index';\nimport options from './options';\nimport { Fragment } from './create-element';\nimport { MODE_HYDRATE, NULL } from './constants';\n\n/**\n * Base Component class. Provides `setState()` and `forceUpdate()`, which\n * trigger rendering\n * @param {object} props The initial component props\n * @param {object} context The initial context from parent components'\n * getChildContext\n */\nexport function BaseComponent(props, context) {\n\tthis.props = props;\n\tthis.context = context;\n}\n\n/**\n * Update component state and schedule a re-render.\n * @this {import('./internal').Component}\n * @param {object | ((s: object, p: object) => object)} update A hash of state\n * properties to update with new values or a function that given the current\n * state and props returns a new partial state\n * @param {() => void} [callback] A function to be called once component state is\n * updated\n */\nBaseComponent.prototype.setState = function (update, callback) {\n\t// only clone state when copying to nextState the first time.\n\tlet s;\n\tif (this._nextState != NULL && this._nextState != this.state) {\n\t\ts = this._nextState;\n\t} else {\n\t\ts = this._nextState = assign({}, this.state);\n\t}\n\n\tif (typeof update == 'function') {\n\t\t// Some libraries like `immer` mark the current state as readonly,\n\t\t// preventing us from mutating it, so we need to clone it. See #2716\n\t\tupdate = update(assign({}, s), this.props);\n\t}\n\n\tif (update) {\n\t\tassign(s, update);\n\t}\n\n\t// Skip update if updater function returned null\n\tif (update == NULL) return;\n\n\tif (this._vnode) {\n\t\tif (callback) {\n\t\t\tthis._stateCallbacks.push(callback);\n\t\t}\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Immediately perform a synchronous re-render of the component\n * @this {import('./internal').Component}\n * @param {() => void} [callback] A function to be called after component is\n * re-rendered\n */\nBaseComponent.prototype.forceUpdate = function (callback) {\n\tif (this._vnode) {\n\t\t// Set render mode so that we can differentiate where the render request\n\t\t// is coming from. We need this because forceUpdate should never call\n\t\t// shouldComponentUpdate\n\t\tthis._force = true;\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t}\n};\n\n/**\n * Accepts `props` and `state`, and returns a new Virtual DOM tree to build.\n * Virtual DOM is generally constructed via [JSX](https://jasonformat.com/wtf-is-jsx).\n * @param {object} props Props (eg: JSX attributes) received from parent\n * element/component\n * @param {object} state The component's current state\n * @param {object} context Context object, as returned by the nearest\n * ancestor's `getChildContext()`\n * @returns {ComponentChildren | void}\n */\nBaseComponent.prototype.render = Fragment;\n\n/**\n * @param {import('./internal').VNode} vnode\n * @param {number | null} [childIndex]\n */\nexport function getDomSibling(vnode, childIndex) {\n\tif (childIndex == NULL) {\n\t\t// Use childIndex==null as a signal to resume the search from the vnode's sibling\n\t\treturn vnode._parent\n\t\t\t? getDomSibling(vnode._parent, vnode._index + 1)\n\t\t\t: NULL;\n\t}\n\n\tlet sibling;\n\tfor (; childIndex < vnode._children.length; childIndex++) {\n\t\tsibling = vnode._children[childIndex];\n\n\t\tif (sibling != NULL && sibling._dom != NULL) {\n\t\t\t// Since updateParentDomPointers keeps _dom pointer correct,\n\t\t\t// we can rely on _dom to tell us if this subtree contains a\n\t\t\t// rendered DOM node, and what the first rendered DOM node is\n\t\t\treturn sibling._dom;\n\t\t}\n\t}\n\n\t// If we get here, we have not found a DOM node in this vnode's children.\n\t// We must resume from this vnode's sibling (in it's parent _children array)\n\t// Only climb up and search the parent if we aren't searching through a DOM\n\t// VNode (meaning we reached the DOM parent of the original vnode that began\n\t// the search)\n\treturn typeof vnode.type == 'function' ? getDomSibling(vnode) : NULL;\n}\n\n/**\n * Trigger in-place re-rendering of a component.\n * @param {import('./internal').Component} component The component to rerender\n */\nfunction renderComponent(component) {\n\tlet oldVNode = component._vnode,\n\t\toldDom = oldVNode._dom,\n\t\tcommitQueue = [],\n\t\trefQueue = [];\n\n\tif (component._parentDom) {\n\t\tconst newVNode = assign({}, oldVNode);\n\t\tnewVNode._original = oldVNode._original + 1;\n\t\tif (options.vnode) options.vnode(newVNode);\n\n\t\tdiff(\n\t\t\tcomponent._parentDom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tcomponent._globalContext,\n\t\t\tcomponent._parentDom.namespaceURI,\n\t\t\toldVNode._flags & MODE_HYDRATE ? [oldDom] : NULL,\n\t\t\tcommitQueue,\n\t\t\toldDom == NULL ? getDomSibling(oldVNode) : oldDom,\n\t\t\t!!(oldVNode._flags & MODE_HYDRATE),\n\t\t\trefQueue\n\t\t);\n\n\t\tnewVNode._original = oldVNode._original;\n\t\tnewVNode._parent._children[newVNode._index] = newVNode;\n\t\tcommitRoot(commitQueue, newVNode, refQueue);\n\t\toldVNode._dom = oldVNode._parent = null;\n\n\t\tif (newVNode._dom != oldDom) {\n\t\t\tupdateParentDomPointers(newVNode);\n\t\t}\n\t}\n}\n\n/**\n * @param {import('./internal').VNode} vnode\n */\nfunction updateParentDomPointers(vnode) {\n\tif ((vnode = vnode._parent) != NULL && vnode._component != NULL) {\n\t\tvnode._dom = vnode._component.base = NULL;\n\t\tfor (let i = 0; i < vnode._children.length; i++) {\n\t\t\tlet child = vnode._children[i];\n\t\t\tif (child != NULL && child._dom != NULL) {\n\t\t\t\tvnode._dom = vnode._component.base = child._dom;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn updateParentDomPointers(vnode);\n\t}\n}\n\n/**\n * The render queue\n * @type {Array<import('./internal').Component>}\n */\nlet rerenderQueue = [];\n\n/*\n * The value of `Component.debounce` must asynchronously invoke the passed in callback. It is\n * important that contributors to Preact can consistently reason about what calls to `setState`, etc.\n * do, and when their effects will be applied. See the links below for some further reading on designing\n * asynchronous APIs.\n * * [Designing APIs for Asynchrony](https://blog.izs.me/2013/08/designing-apis-for-asynchrony)\n * * [Callbacks synchronous and asynchronous](https://blog.ometer.com/2011/07/24/callbacks-synchronous-and-asynchronous/)\n */\n\nlet prevDebounce;\n\nconst defer =\n\ttypeof Promise == 'function'\n\t\t? Promise.prototype.then.bind(Promise.resolve())\n\t\t: setTimeout;\n\n/**\n * Enqueue a rerender of a component\n * @param {import('./internal').Component} c The component to rerender\n */\nexport function enqueueRender(c) {\n\tif (\n\t\t(!c._dirty &&\n\t\t\t(c._dirty = true) &&\n\t\t\trerenderQueue.push(c) &&\n\t\t\t!process._rerenderCount++) ||\n\t\tprevDebounce != options.debounceRendering\n\t) {\n\t\tprevDebounce = options.debounceRendering;\n\t\t(prevDebounce || defer)(process);\n\t}\n}\n\n/**\n * @param {import('./internal').Component} a\n * @param {import('./internal').Component} b\n */\nconst depthSort = (a, b) => a._vnode._depth - b._vnode._depth;\n\n/** Flush the render queue by rerendering all queued components */\nfunction process() {\n\tlet c,\n\t\tl = 1;\n\n\t// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary\n\t// process() calls from getting scheduled while `queue` is still being consumed.\n\twhile (rerenderQueue.length) {\n\t\t// Keep the rerender queue sorted by (depth, insertion order). The queue\n\t\t// will initially be sorted on the first iteration only if it has more than 1 item.\n\t\t//\n\t\t// New items can be added to the queue e.g. when rerendering a provider, so we want to\n\t\t// keep the order from top to bottom with those new items so we can handle them in a\n\t\t// single pass\n\t\tif (rerenderQueue.length > l) {\n\t\t\trerenderQueue.sort(depthSort);\n\t\t}\n\n\t\tc = rerenderQueue.shift();\n\t\tl = rerenderQueue.length;\n\n\t\tif (c._dirty) {\n\t\t\trenderComponent(c);\n\t\t}\n\t}\n\tprocess._rerenderCount = 0;\n}\n\nprocess._rerenderCount = 0;\n","import { IS_NON_DIMENSIONAL, NULL, SVG_NAMESPACE } from '../constants';\nimport options from '../options';\n\nfunction setStyle(style, key, value) {\n\tif (key[0] == '-') {\n\t\tstyle.setProperty(key, value == NULL ? '' : value);\n\t} else if (value == NULL) {\n\t\tstyle[key] = '';\n\t} else if (typeof value != 'number' || IS_NON_DIMENSIONAL.test(key)) {\n\t\tstyle[key] = value;\n\t} else {\n\t\tstyle[key] = value + 'px';\n\t}\n}\n\nconst CAPTURE_REGEX = /(PointerCapture)$|Capture$/i;\n\n// A logical clock to solve issues like https://github.com/preactjs/preact/issues/3927.\n// When the DOM performs an event it leaves micro-ticks in between bubbling up which means that\n// an event can trigger on a newly reated DOM-node while the event bubbles up.\n//\n// Originally inspired by Vue\n// (https://github.com/vuejs/core/blob/caeb8a68811a1b0f79/packages/runtime-dom/src/modules/events.ts#L90-L101),\n// but modified to use a logical clock instead of Date.now() in case event handlers get attached\n// and events get dispatched during the same millisecond.\n//\n// The clock is incremented after each new event dispatch. This allows 1 000 000 new events\n// per second for over 280 years before the value reaches Number.MAX_SAFE_INTEGER (2**53 - 1).\nlet eventClock = 0;\n\n/**\n * Set a property value on a DOM node\n * @param {import('../internal').PreactElement} dom The DOM node to modify\n * @param {string} name The name of the property to set\n * @param {*} value The value to set the property to\n * @param {*} oldValue The old value the property had\n * @param {string} namespace Whether or not this DOM node is an SVG node or not\n */\nexport function setProperty(dom, name, value, oldValue, namespace) {\n\tlet useCapture;\n\n\to: if (name == 'style') {\n\t\tif (typeof value == 'string') {\n\t\t\tdom.style.cssText = value;\n\t\t} else {\n\t\t\tif (typeof oldValue == 'string') {\n\t\t\t\tdom.style.cssText = oldValue = '';\n\t\t\t}\n\n\t\t\tif (oldValue) {\n\t\t\t\tfor (name in oldValue) {\n\t\t\t\t\tif (!(value && name in value)) {\n\t\t\t\t\t\tsetStyle(dom.style, name, '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (value) {\n\t\t\t\tfor (name in value) {\n\t\t\t\t\tif (!oldValue || value[name] != oldValue[name]) {\n\t\t\t\t\t\tsetStyle(dom.style, name, value[name]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Benchmark for comparison: https://esbench.com/bench/574c954bdb965b9a00965ac6\n\telse if (name[0] == 'o' && name[1] == 'n') {\n\t\tuseCapture = name != (name = name.replace(CAPTURE_REGEX, '$1'));\n\t\tconst lowerCaseName = name.toLowerCase();\n\n\t\t// Infer correct casing for DOM built-in events:\n\t\tif (lowerCaseName in dom || name == 'onFocusOut' || name == 'onFocusIn')\n\t\t\tname = lowerCaseName.slice(2);\n\t\telse name = name.slice(2);\n\n\t\tif (!dom._listeners) dom._listeners = {};\n\t\tdom._listeners[name + useCapture] = value;\n\n\t\tif (value) {\n\t\t\tif (!oldValue) {\n\t\t\t\tvalue._attached = eventClock;\n\t\t\t\tdom.addEventListener(\n\t\t\t\t\tname,\n\t\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\t\tuseCapture\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tvalue._attached = oldValue._attached;\n\t\t\t}\n\t\t} else {\n\t\t\tdom.removeEventListener(\n\t\t\t\tname,\n\t\t\t\tuseCapture ? eventProxyCapture : eventProxy,\n\t\t\t\tuseCapture\n\t\t\t);\n\t\t}\n\t} else {\n\t\tif (namespace == SVG_NAMESPACE) {\n\t\t\t// Normalize incorrect prop usage for SVG:\n\t\t\t// - xlink:href / xlinkHref --> href (xlink:href was removed from SVG and isn't needed)\n\t\t\t// - className --> class\n\t\t\tname = name.replace(/xlink(H|:h)/, 'h').replace(/sName$/, 's');\n\t\t} else if (\n\t\t\tname != 'width' &&\n\t\t\tname != 'height' &&\n\t\t\tname != 'href' &&\n\t\t\tname != 'list' &&\n\t\t\tname != 'form' &&\n\t\t\t// Default value in browsers is `-1` and an empty string is\n\t\t\t// cast to `0` instead\n\t\t\tname != 'tabIndex' &&\n\t\t\tname != 'download' &&\n\t\t\tname != 'rowSpan' &&\n\t\t\tname != 'colSpan' &&\n\t\t\tname != 'role' &&\n\t\t\tname != 'popover' &&\n\t\t\tname in dom\n\t\t) {\n\t\t\ttry {\n\t\t\t\tdom[name] = value == NULL ? '' : value;\n\t\t\t\t// labelled break is 1b smaller here than a return statement (sorry)\n\t\t\t\tbreak o;\n\t\t\t} catch (e) {}\n\t\t}\n\n\t\t// aria- and data- attributes have no boolean representation.\n\t\t// A `false` value is different from the attribute not being\n\t\t// present, so we can't remove it. For non-boolean aria\n\t\t// attributes we could treat false as a removal, but the\n\t\t// amount of exceptions would cost too many bytes. On top of\n\t\t// that other frameworks generally stringify `false`.\n\n\t\tif (typeof value == 'function') {\n\t\t\t// never serialize functions as attribute values\n\t\t} else if (value != NULL && (value !== false || name[4] == '-')) {\n\t\t\tdom.setAttribute(name, name == 'popover' && value == true ? '' : value);\n\t\t} else {\n\t\t\tdom.removeAttribute(name);\n\t\t}\n\t}\n}\n\n/**\n * Create an event proxy function.\n * @param {boolean} useCapture Is the event handler for the capture phase.\n * @private\n */\nfunction createEventProxy(useCapture) {\n\t/**\n\t * Proxy an event to hooked event handlers\n\t * @param {import('../internal').PreactEvent} e The event object from the browser\n\t * @private\n\t */\n\treturn function (e) {\n\t\tif (this._listeners) {\n\t\t\tconst eventHandler = this._listeners[e.type + useCapture];\n\t\t\tif (e._dispatched == NULL) {\n\t\t\t\te._dispatched = eventClock++;\n\n\t\t\t\t// When `e._dispatched` is smaller than the time when the targeted event\n\t\t\t\t// handler was attached we know we have bubbled up to an element that was added\n\t\t\t\t// during patching the DOM.\n\t\t\t} else if (e._dispatched < eventHandler._attached) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn eventHandler(options.event ? options.event(e) : e);\n\t\t}\n\t};\n}\n\nconst eventProxy = createEventProxy(false);\nconst eventProxyCapture = createEventProxy(true);\n","import { enqueueRender } from './component';\nimport { NULL } from './constants';\n\nexport let i = 0;\n\nexport function createContext(defaultValue) {\n\tfunction Context(props) {\n\t\tif (!this.getChildContext) {\n\t\t\t/** @type {Set<import('./internal').Component> | null} */\n\t\t\tlet subs = new Set();\n\t\t\tlet ctx = {};\n\t\t\tctx[Context._id] = this;\n\n\t\t\tthis.getChildContext = () => ctx;\n\n\t\t\tthis.componentWillUnmount = () => {\n\t\t\t\tsubs = NULL;\n\t\t\t};\n\n\t\t\tthis.shouldComponentUpdate = function (_props) {\n\t\t\t\t// @ts-expect-error even\n\t\t\t\tif (this.props.value != _props.value) {\n\t\t\t\t\tsubs.forEach(c => {\n\t\t\t\t\t\tc._force = true;\n\t\t\t\t\t\tenqueueRender(c);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.sub = c => {\n\t\t\t\tsubs.add(c);\n\t\t\t\tlet old = c.componentWillUnmount;\n\t\t\t\tc.componentWillUnmount = () => {\n\t\t\t\t\tif (subs) {\n\t\t\t\t\t\tsubs.delete(c);\n\t\t\t\t\t}\n\t\t\t\t\tif (old) old.call(c);\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\n\t\treturn props.children;\n\t}\n\n\tContext._id = '__cC' + i++;\n\tContext._defaultValue = defaultValue;\n\n\t/** @type {import('./internal').FunctionComponent} */\n\tContext.Consumer = (props, contextValue) => {\n\t\treturn props.children(contextValue);\n\t};\n\n\t// we could also get rid of _contextRef entirely\n\tContext.Provider =\n\t\tContext._contextRef =\n\t\tContext.Consumer.contextType =\n\t\t\tContext;\n\n\treturn Context;\n}\n","import { diff, unmount, applyRef } from './index';\nimport { createVNode, Fragment } from '../create-element';\nimport {\n\tEMPTY_OBJ,\n\tEMPTY_ARR,\n\tINSERT_VNODE,\n\tMATCHED,\n\tUNDEFINED,\n\tNULL\n} from '../constants';\nimport { isArray } from '../util';\nimport { getDomSibling } from '../component';\n\n/**\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * Diff the children of a virtual node\n * @param {PreactElement} parentDom The DOM element whose children are being\n * diffed\n * @param {ComponentChildren[]} renderResult\n * @param {VNode} newParentVNode The new virtual node whose children should be\n * diff'ed against oldParentVNode\n * @param {VNode} oldParentVNode The old virtual node whose children should be\n * diff'ed against newParentVNode\n * @param {object} globalContext The current context object - modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n */\nexport function diffChildren(\n\tparentDom,\n\trenderResult,\n\tnewParentVNode,\n\toldParentVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\tlet i,\n\t\t/** @type {VNode} */\n\t\toldVNode,\n\t\t/** @type {VNode} */\n\t\tchildVNode,\n\t\t/** @type {PreactElement} */\n\t\tnewDom,\n\t\t/** @type {PreactElement} */\n\t\tfirstChildDom;\n\n\t// This is a compression of oldParentVNode!=null && oldParentVNode != EMPTY_OBJ && oldParentVNode._children || EMPTY_ARR\n\t// as EMPTY_OBJ._children should be `undefined`.\n\t/** @type {VNode[]} */\n\tlet oldChildren = (oldParentVNode && oldParentVNode._children) || EMPTY_ARR;\n\n\tlet newChildrenLength = renderResult.length;\n\n\toldDom = constructNewChildrenArray(\n\t\tnewParentVNode,\n\t\trenderResult,\n\t\toldChildren,\n\t\toldDom,\n\t\tnewChildrenLength\n\t);\n\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\tchildVNode = newParentVNode._children[i];\n\t\tif (childVNode == NULL) continue;\n\n\t\t// At this point, constructNewChildrenArray has assigned _index to be the\n\t\t// matchingIndex for this VNode's oldVNode (or -1 if there is no oldVNode).\n\t\tif (childVNode._index == -1) {\n\t\t\toldVNode = EMPTY_OBJ;\n\t\t} else {\n\t\t\toldVNode = oldChildren[childVNode._index] || EMPTY_OBJ;\n\t\t}\n\n\t\t// Update childVNode._index to its final index\n\t\tchildVNode._index = i;\n\n\t\t// Morph the old element into the new one, but don't append it to the dom yet\n\t\tlet result = diff(\n\t\t\tparentDom,\n\t\t\tchildVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\toldDom,\n\t\t\tisHydrating,\n\t\t\trefQueue\n\t\t);\n\n\t\t// Adjust DOM nodes\n\t\tnewDom = childVNode._dom;\n\t\tif (childVNode.ref && oldVNode.ref != childVNode.ref) {\n\t\t\tif (oldVNode.ref) {\n\t\t\t\tapplyRef(oldVNode.ref, NULL, childVNode);\n\t\t\t}\n\t\t\trefQueue.push(\n\t\t\t\tchildVNode.ref,\n\t\t\t\tchildVNode._component || newDom,\n\t\t\t\tchildVNode\n\t\t\t);\n\t\t}\n\n\t\tif (firstChildDom == NULL && newDom != NULL) {\n\t\t\tfirstChildDom = newDom;\n\t\t}\n\n\t\tlet shouldPlace = !!(childVNode._flags & INSERT_VNODE);\n\t\tif (shouldPlace || oldVNode._children === childVNode._children) {\n\t\t\toldDom = insert(childVNode, oldDom, parentDom, shouldPlace);\n\t\t} else if (typeof childVNode.type == 'function' && result !== UNDEFINED) {\n\t\t\toldDom = result;\n\t\t} else if (newDom) {\n\t\t\toldDom = newDom.nextSibling;\n\t\t}\n\n\t\t// Unset diffing flags\n\t\tchildVNode._flags &= ~(INSERT_VNODE | MATCHED);\n\t}\n\n\tnewParentVNode._dom = firstChildDom;\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} newParentVNode\n * @param {ComponentChildren[]} renderResult\n * @param {VNode[]} oldChildren\n */\nfunction constructNewChildrenArray(\n\tnewParentVNode,\n\trenderResult,\n\toldChildren,\n\toldDom,\n\tnewChildrenLength\n) {\n\t/** @type {number} */\n\tlet i;\n\t/** @type {VNode} */\n\tlet childVNode;\n\t/** @type {VNode} */\n\tlet oldVNode;\n\n\tlet oldChildrenLength = oldChildren.length,\n\t\tremainingOldChildren = oldChildrenLength;\n\n\tlet skew = 0;\n\n\tnewParentVNode._children = new Array(newChildrenLength);\n\tfor (i = 0; i < newChildrenLength; i++) {\n\t\t// @ts-expect-error We are reusing the childVNode variable to hold both the\n\t\t// pre and post normalized childVNode\n\t\tchildVNode = renderResult[i];\n\n\t\tif (\n\t\t\tchildVNode == NULL ||\n\t\t\ttypeof childVNode == 'boolean' ||\n\t\t\ttypeof childVNode == 'function'\n\t\t) {\n\t\t\tnewParentVNode._children[i] = NULL;\n\t\t\tcontinue;\n\t\t}\n\t\t// If this newVNode is being reused (e.g. <div>{reuse}{reuse}</div>) in the same diff,\n\t\t// or we are rendering a component (e.g. setState) copy the oldVNodes so it can have\n\t\t// it's own DOM & etc. pointers\n\t\telse if (\n\t\t\ttypeof childVNode == 'string' ||\n\t\t\ttypeof childVNode == 'number' ||\n\t\t\t// eslint-disable-next-line valid-typeof\n\t\t\ttypeof childVNode == 'bigint' ||\n\t\t\tchildVNode.constructor == String\n\t\t) {\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tNULL,\n\t\t\t\tchildVNode,\n\t\t\t\tNULL,\n\t\t\t\tNULL,\n\t\t\t\tNULL\n\t\t\t);\n\t\t} else if (isArray(childVNode)) {\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tFragment,\n\t\t\t\t{ children: childVNode },\n\t\t\t\tNULL,\n\t\t\t\tNULL,\n\t\t\t\tNULL\n\t\t\t);\n\t\t} else if (childVNode.constructor === UNDEFINED && childVNode._depth > 0) {\n\t\t\t// VNode is already in use, clone it. This can happen in the following\n\t\t\t// scenario:\n\t\t\t// const reuse = <div />\n\t\t\t// <div>{reuse}<span />{reuse}</div>\n\t\t\tchildVNode = newParentVNode._children[i] = createVNode(\n\t\t\t\tchildVNode.type,\n\t\t\t\tchildVNode.props,\n\t\t\t\tchildVNode.key,\n\t\t\t\tchildVNode.ref ? childVNode.ref : NULL,\n\t\t\t\tchildVNode._original\n\t\t\t);\n\t\t} else {\n\t\t\tnewParentVNode._children[i] = childVNode;\n\t\t}\n\n\t\tconst skewedIndex = i + skew;\n\t\tchildVNode._parent = newParentVNode;\n\t\tchildVNode._depth = newParentVNode._depth + 1;\n\n\t\t// Temporarily store the matchingIndex on the _index property so we can pull\n\t\t// out the oldVNode in diffChildren. We'll override this to the VNode's\n\t\t// final index after using this property to get the oldVNode\n\t\tconst matchingIndex = (childVNode._index = findMatchingIndex(\n\t\t\tchildVNode,\n\t\t\toldChildren,\n\t\t\tskewedIndex,\n\t\t\tremainingOldChildren\n\t\t));\n\n\t\toldVNode = NULL;\n\t\tif (matchingIndex != -1) {\n\t\t\toldVNode = oldChildren[matchingIndex];\n\t\t\tremainingOldChildren--;\n\t\t\tif (oldVNode) {\n\t\t\t\toldVNode._flags |= MATCHED;\n\t\t\t}\n\t\t}\n\n\t\t// Here, we define isMounting for the purposes of the skew diffing\n\t\t// algorithm. Nodes that are unsuspending are considered mounting and we detect\n\t\t// this by checking if oldVNode._original == null\n\t\tconst isMounting = oldVNode == NULL || oldVNode._original == NULL;\n\n\t\tif (isMounting) {\n\t\t\tif (matchingIndex == -1) {\n\t\t\t\t// When the array of children is growing we need to decrease the skew\n\t\t\t\t// as we are adding a new element to the array.\n\t\t\t\t// Example:\n\t\t\t\t// [1, 2, 3] --> [0, 1, 2, 3]\n\t\t\t\t// oldChildren newChildren\n\t\t\t\t//\n\t\t\t\t// The new element is at index 0, so our skew is 0,\n\t\t\t\t// we need to decrease the skew as we are adding a new element.\n\t\t\t\t// The decrease will cause us to compare the element at position 1\n\t\t\t\t// with value 1 with the element at position 0 with value 0.\n\t\t\t\t//\n\t\t\t\t// A linear concept is applied when the array is shrinking,\n\t\t\t\t// if the length is unchanged we can assume that no skew\n\t\t\t\t// changes are needed.\n\t\t\t\tif (newChildrenLength > oldChildrenLength) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else if (newChildrenLength < oldChildrenLength) {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we are mounting a DOM VNode, mark it for insertion\n\t\t\tif (typeof childVNode.type != 'function') {\n\t\t\t\tchildVNode._flags |= INSERT_VNODE;\n\t\t\t}\n\t\t} else if (matchingIndex != skewedIndex) {\n\t\t\t// When we move elements around i.e. [0, 1, 2] --> [1, 0, 2]\n\t\t\t// --> we diff 1, we find it at position 1 while our skewed index is 0 and our skew is 0\n\t\t\t// we set the skew to 1 as we found an offset.\n\t\t\t// --> we diff 0, we find it at position 0 while our skewed index is at 2 and our skew is 1\n\t\t\t// this makes us increase the skew again.\n\t\t\t// --> we diff 2, we find it at position 2 while our skewed index is at 4 and our skew is 2\n\t\t\t//\n\t\t\t// this becomes an optimization question where currently we see a 1 element offset as an insertion\n\t\t\t// or deletion i.e. we optimize for [0, 1, 2] --> [9, 0, 1, 2]\n\t\t\t// while a more than 1 offset we see as a swap.\n\t\t\t// We could probably build heuristics for having an optimized course of action here as well, but\n\t\t\t// might go at the cost of some bytes.\n\t\t\t//\n\t\t\t// If we wanted to optimize for i.e. only swaps we'd just do the last two code-branches and have\n\t\t\t// only the first item be a re-scouting and all the others fall in their skewed counter-part.\n\t\t\t// We could also further optimize for swaps\n\t\t\tif (matchingIndex == skewedIndex - 1) {\n\t\t\t\tskew--;\n\t\t\t} else if (matchingIndex == skewedIndex + 1) {\n\t\t\t\tskew++;\n\t\t\t} else {\n\t\t\t\tif (matchingIndex > skewedIndex) {\n\t\t\t\t\tskew--;\n\t\t\t\t} else {\n\t\t\t\t\tskew++;\n\t\t\t\t}\n\n\t\t\t\t// Move this VNode's DOM if the original index (matchingIndex) doesn't\n\t\t\t\t// match the new skew index (i + new skew)\n\t\t\t\t// In the former two branches we know that it matches after skewing\n\t\t\t\tchildVNode._flags |= INSERT_VNODE;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove remaining oldChildren if there are any. Loop forwards so that as we\n\t// unmount DOM from the beginning of the oldChildren, we can adjust oldDom to\n\t// point to the next child, which needs to be the first DOM node that won't be\n\t// unmounted.\n\tif (remainingOldChildren) {\n\t\tfor (i = 0; i < oldChildrenLength; i++) {\n\t\t\toldVNode = oldChildren[i];\n\t\t\tif (oldVNode != NULL && (oldVNode._flags & MATCHED) == 0) {\n\t\t\t\tif (oldVNode._dom == oldDom) {\n\t\t\t\t\toldDom = getDomSibling(oldVNode);\n\t\t\t\t}\n\n\t\t\t\tunmount(oldVNode, oldVNode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn oldDom;\n}\n\n/**\n * @param {VNode} parentVNode\n * @param {PreactElement} oldDom\n * @param {PreactElement} parentDom\n * @param {boolean} shouldPlace\n * @returns {PreactElement}\n */\nfunction insert(parentVNode, oldDom, parentDom, shouldPlace) {\n\t// Note: VNodes in nested suspended trees may be missing _children.\n\n\tif (typeof parentVNode.type == 'function') {\n\t\tlet children = parentVNode._children;\n\t\tfor (let i = 0; children && i < children.length; i++) {\n\t\t\tif (children[i]) {\n\t\t\t\t// If we enter this code path on sCU bailout, where we copy\n\t\t\t\t// oldVNode._children to newVNode._children, we need to update the old\n\t\t\t\t// children's _parent pointer to point to the newVNode (parentVNode\n\t\t\t\t// here).\n\t\t\t\tchildren[i]._parent = parentVNode;\n\t\t\t\toldDom = insert(children[i], oldDom, parentDom, shouldPlace);\n\t\t\t}\n\t\t}\n\n\t\treturn oldDom;\n\t} else if (parentVNode._dom != oldDom) {\n\t\tif (shouldPlace) {\n\t\t\tif (oldDom && parentVNode.type && !oldDom.parentNode) {\n\t\t\t\toldDom = getDomSibling(parentVNode);\n\t\t\t}\n\t\t\tparentDom.insertBefore(parentVNode._dom, oldDom || NULL);\n\t\t}\n\t\toldDom = parentVNode._dom;\n\t}\n\n\tdo {\n\t\toldDom = oldDom && oldDom.nextSibling;\n\t} while (oldDom != NULL && oldDom.nodeType == 8);\n\n\treturn oldDom;\n}\n\n/**\n * Flatten and loop through the children of a virtual node\n * @param {ComponentChildren} children The unflattened children of a virtual\n * node\n * @returns {VNode[]}\n */\nexport function toChildArray(children, out) {\n\tout = out || [];\n\tif (children == NULL || typeof children == 'boolean') {\n\t} else if (isArray(children)) {\n\t\tchildren.some(child => {\n\t\t\ttoChildArray(child, out);\n\t\t});\n\t} else {\n\t\tout.push(children);\n\t}\n\treturn out;\n}\n\n/**\n * @param {VNode} childVNode\n * @param {VNode[]} oldChildren\n * @param {number} skewedIndex\n * @param {number} remainingOldChildren\n * @returns {number}\n */\nfunction findMatchingIndex(\n\tchildVNode,\n\toldChildren,\n\tskewedIndex,\n\tremainingOldChildren\n) {\n\tconst key = childVNode.key;\n\tconst type = childVNode.type;\n\tlet oldVNode = oldChildren[skewedIndex];\n\tconst matched = oldVNode != NULL && (oldVNode._flags & MATCHED) == 0;\n\n\t// We only need to perform a search if there are more children\n\t// (remainingOldChildren) to search. However, if the oldVNode we just looked\n\t// at skewedIndex was not already used in this diff, then there must be at\n\t// least 1 other (so greater than 1) remainingOldChildren to attempt to match\n\t// against. So the following condition checks that ensuring\n\t// remainingOldChildren > 1 if the oldVNode is not already used/matched. Else\n\t// if the oldVNode was null or matched, then there could needs to be at least\n\t// 1 (aka `remainingOldChildren > 0`) children to find and compare against.\n\t//\n\t// If there is an unkeyed functional VNode, that isn't a built-in like our Fragment,\n\t// we should not search as we risk re-using state of an unrelated VNode. (reverted for now)\n\tlet shouldSearch =\n\t\t// (typeof type != 'function' || type === Fragment || key) &&\n\t\tremainingOldChildren > (matched ? 1 : 0);\n\n\tif (\n\t\t(oldVNode === NULL && key == null) ||\n\t\t(matched && key == oldVNode.key && type == oldVNode.type)\n\t) {\n\t\treturn skewedIndex;\n\t} else if (shouldSearch) {\n\t\tlet x = skewedIndex - 1;\n\t\tlet y = skewedIndex + 1;\n\t\twhile (x >= 0 || y < oldChildren.length) {\n\t\t\tconst childIndex = x >= 0 ? x-- : y++;\n\t\t\toldVNode = oldChildren[childIndex];\n\t\t\tif (\n\t\t\t\toldVNode != NULL &&\n\t\t\t\t(oldVNode._flags & MATCHED) == 0 &&\n\t\t\t\tkey == oldVNode.key &&\n\t\t\t\ttype == oldVNode.type\n\t\t\t) {\n\t\t\t\treturn childIndex;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn -1;\n}\n","import {\n\tEMPTY_OBJ,\n\tMATH_NAMESPACE,\n\tMODE_HYDRATE,\n\tMODE_SUSPENDED,\n\tNULL,\n\tRESET_MODE,\n\tSVG_NAMESPACE,\n\tUNDEFINED,\n\tXHTML_NAMESPACE\n} from '../constants';\nimport { BaseComponent, getDomSibling } from '../component';\nimport { Fragment } from '../create-element';\nimport { diffChildren } from './children';\nimport { setProperty } from './props';\nimport { assign, isArray, removeNode, slice } from '../util';\nimport options from '../options';\n\n/**\n * @typedef {import('../internal').ComponentChildren} ComponentChildren\n * @typedef {import('../internal').Component} Component\n * @typedef {import('../internal').PreactElement} PreactElement\n * @typedef {import('../internal').VNode} VNode\n */\n\n/**\n * @template {any} T\n * @typedef {import('../internal').Ref<T>} Ref<T>\n */\n\n/**\n * Diff two virtual nodes and apply proper changes to the DOM\n * @param {PreactElement} parentDom The parent of the DOM element\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object. Modified by\n * getChildContext\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {PreactElement} oldDom The current attached DOM element any new dom\n * elements should be placed around. Likely `null` on first render (except when\n * hydrating). Can be a sibling DOM element when diffing Fragments that have\n * siblings. In most cases, it starts out as `oldChildren[0]._dom`.\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n */\nexport function diff(\n\tparentDom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\toldDom,\n\tisHydrating,\n\trefQueue\n) {\n\t/** @type {any} */\n\tlet tmp,\n\t\tnewType = newVNode.type;\n\n\t// When passing through createElement it assigns the object\n\t// constructor as undefined. This to prevent JSON-injection.\n\tif (newVNode.constructor !== UNDEFINED) return NULL;\n\n\t// If the previous diff bailed out, resume creating/hydrating.\n\tif (oldVNode._flags & MODE_SUSPENDED) {\n\t\tisHydrating = !!(oldVNode._flags & MODE_HYDRATE);\n\t\toldDom = newVNode._dom = oldVNode._dom;\n\t\texcessDomChildren = [oldDom];\n\t}\n\n\tif ((tmp = options._diff)) tmp(newVNode);\n\n\touter: if (typeof newType == 'function') {\n\t\ttry {\n\t\t\tlet c, isNew, oldProps, oldState, snapshot, clearProcessingException;\n\t\t\tlet newProps = newVNode.props;\n\t\t\tconst isClassComponent =\n\t\t\t\t'prototype' in newType && newType.prototype.render;\n\n\t\t\t// Necessary for createContext api. Setting this property will pass\n\t\t\t// the context value as `this.context` just for this component.\n\t\t\ttmp = newType.contextType;\n\t\t\tlet provider = tmp && globalContext[tmp._id];\n\t\t\tlet componentContext = tmp\n\t\t\t\t? provider\n\t\t\t\t\t? provider.props.value\n\t\t\t\t\t: tmp._defaultValue\n\t\t\t\t: globalContext;\n\n\t\t\t// Get component and set it to `c`\n\t\t\tif (oldVNode._component) {\n\t\t\t\tc = newVNode._component = oldVNode._component;\n\t\t\t\tclearProcessingException = c._processingException = c._pendingError;\n\t\t\t} else {\n\t\t\t\t// Instantiate the new component\n\t\t\t\tif (isClassComponent) {\n\t\t\t\t\t// @ts-expect-error The check above verifies that newType is suppose to be constructed\n\t\t\t\t\tnewVNode._component = c = new newType(newProps, componentContext); // eslint-disable-line new-cap\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error Trust me, Component implements the interface we want\n\t\t\t\t\tnewVNode._component = c = new BaseComponent(\n\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t);\n\t\t\t\t\tc.constructor = newType;\n\t\t\t\t\tc.render = doRender;\n\t\t\t\t}\n\t\t\t\tif (provider) provider.sub(c);\n\n\t\t\t\tif (!c.state) c.state = {};\n\t\t\t\tc._globalContext = globalContext;\n\t\t\t\tisNew = c._dirty = true;\n\t\t\t\tc._renderCallbacks = [];\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t}\n\n\t\t\t// Invoke getDerivedStateFromProps\n\t\t\tif (isClassComponent && c._nextState == NULL) {\n\t\t\t\tc._nextState = c.state;\n\t\t\t}\n\n\t\t\tif (isClassComponent && newType.getDerivedStateFromProps != NULL) {\n\t\t\t\tif (c._nextState == c.state) {\n\t\t\t\t\tc._nextState = assign({}, c._nextState);\n\t\t\t\t}\n\n\t\t\t\tassign(\n\t\t\t\t\tc._nextState,\n\t\t\t\t\tnewType.getDerivedStateFromProps(newProps, c._nextState)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\toldProps = c.props;\n\t\t\toldState = c.state;\n\t\t\tc._vnode = newVNode;\n\n\t\t\t// Invoke pre-render lifecycle methods\n\t\t\tif (isNew) {\n\t\t\t\tif (\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\tnewType.getDerivedStateFromProps == NULL &&\n\t\t\t\t\tc.componentWillMount != NULL\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillMount();\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidMount != NULL) {\n\t\t\t\t\tc._renderCallbacks.push(c.componentDidMount);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tisClassComponent &&\n\t\t\t\t\tnewType.getDerivedStateFromProps == NULL &&\n\t\t\t\t\tnewProps !== oldProps &&\n\t\t\t\t\tc.componentWillReceiveProps != NULL\n\t\t\t\t) {\n\t\t\t\t\tc.componentWillReceiveProps(newProps, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tnewVNode._original == oldVNode._original ||\n\t\t\t\t\t(!c._force &&\n\t\t\t\t\t\tc.shouldComponentUpdate != NULL &&\n\t\t\t\t\t\tc.shouldComponentUpdate(\n\t\t\t\t\t\t\tnewProps,\n\t\t\t\t\t\t\tc._nextState,\n\t\t\t\t\t\t\tcomponentContext\n\t\t\t\t\t\t) === false)\n\t\t\t\t) {\n\t\t\t\t\t// More info about this here: https://gist.github.com/JoviDeCroock/bec5f2ce93544d2e6070ef8e0036e4e8\n\t\t\t\t\tif (newVNode._original != oldVNode._original) {\n\t\t\t\t\t\t// When we are dealing with a bail because of sCU we have to update\n\t\t\t\t\t\t// the props, state and dirty-state.\n\t\t\t\t\t\t// when we are dealing with strict-equality we don't as the child could still\n\t\t\t\t\t\t// be dirtied see #3883\n\t\t\t\t\t\tc.props = newProps;\n\t\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t\t\tc._dirty = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\t\tnewVNode._children.some(vnode => {\n\t\t\t\t\t\tif (vnode) vnode._parent = newVNode;\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (let i = 0; i < c._stateCallbacks.length; i++) {\n\t\t\t\t\t\tc._renderCallbacks.push(c._stateCallbacks[i]);\n\t\t\t\t\t}\n\t\t\t\t\tc._stateCallbacks = [];\n\n\t\t\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\t\t\tcommitQueue.push(c);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\n\t\t\t\tif (c.componentWillUpdate != NULL) {\n\t\t\t\t\tc.componentWillUpdate(newProps, c._nextState, componentContext);\n\t\t\t\t}\n\n\t\t\t\tif (isClassComponent && c.componentDidUpdate != NULL) {\n\t\t\t\t\tc._renderCallbacks.push(() => {\n\t\t\t\t\t\tc.componentDidUpdate(oldProps, oldState, snapshot);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tc.context = componentContext;\n\t\t\tc.props = newProps;\n\t\t\tc._parentDom = parentDom;\n\t\t\tc._force = false;\n\n\t\t\tlet renderHook = options._render,\n\t\t\t\tcount = 0;\n\t\t\tif (isClassComponent) {\n\t\t\t\tc.state = c._nextState;\n\t\t\t\tc._dirty = false;\n\n\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\tfor (let i = 0; i < c._stateCallbacks.length; i++) {\n\t\t\t\t\tc._renderCallbacks.push(c._stateCallbacks[i]);\n\t\t\t\t}\n\t\t\t\tc._stateCallbacks = [];\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tc._dirty = false;\n\t\t\t\t\tif (renderHook) renderHook(newVNode);\n\n\t\t\t\t\ttmp = c.render(c.props, c.state, c.context);\n\n\t\t\t\t\t// Handle setState called in render, see #2553\n\t\t\t\t\tc.state = c._nextState;\n\t\t\t\t} while (c._dirty && ++count < 25);\n\t\t\t}\n\n\t\t\t// Handle setState called in render, see #2553\n\t\t\tc.state = c._nextState;\n\n\t\t\tif (c.getChildContext != NULL) {\n\t\t\t\tglobalContext = assign(assign({}, globalContext), c.getChildContext());\n\t\t\t}\n\n\t\t\tif (isClassComponent && !isNew && c.getSnapshotBeforeUpdate != NULL) {\n\t\t\t\tsnapshot = c.getSnapshotBeforeUpdate(oldProps, oldState);\n\t\t\t}\n\n\t\t\tlet isTopLevelFragment =\n\t\t\t\ttmp != NULL && tmp.type === Fragment && tmp.key == NULL;\n\t\t\tlet renderResult = tmp;\n\n\t\t\tif (isTopLevelFragment) {\n\t\t\t\trenderResult = cloneNode(tmp.props.children);\n\t\t\t}\n\n\t\t\toldDom = diffChildren(\n\t\t\t\tparentDom,\n\t\t\t\tisArray(renderResult) ? renderResult : [renderResult],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnamespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\toldDom,\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\tc.base = newVNode._dom;\n\n\t\t\t// We successfully rendered this VNode, unset any stored hydration/bailout state:\n\t\t\tnewVNode._flags &= RESET_MODE;\n\n\t\t\tif (c._renderCallbacks.length) {\n\t\t\t\tcommitQueue.push(c);\n\t\t\t}\n\n\t\t\tif (clearProcessingException) {\n\t\t\t\tc._pendingError = c._processingException = NULL;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tnewVNode._original = NULL;\n\t\t\t// if hydrating or creating initial tree, bailout preserves DOM:\n\t\t\tif (isHydrating || excessDomChildren != NULL) {\n\t\t\t\tif (e.then) {\n\t\t\t\t\tnewVNode._flags |= isHydrating\n\t\t\t\t\t\t? MODE_HYDRATE | MODE_SUSPENDED\n\t\t\t\t\t\t: MODE_SUSPENDED;\n\n\t\t\t\t\twhile (oldDom && oldDom.nodeType == 8 && oldDom.nextSibling) {\n\t\t\t\t\t\toldDom = oldDom.nextSibling;\n\t\t\t\t\t}\n\n\t\t\t\t\texcessDomChildren[excessDomChildren.indexOf(oldDom)] = NULL;\n\t\t\t\t\tnewVNode._dom = oldDom;\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = excessDomChildren.length; i--; ) {\n\t\t\t\t\t\tremoveNode(excessDomChildren[i]);\n\t\t\t\t\t}\n\t\t\t\t\tmarkAsForce(newVNode);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewVNode._dom = oldVNode._dom;\n\t\t\t\tnewVNode._children = oldVNode._children;\n\t\t\t\tif (!e.then) markAsForce(newVNode);\n\t\t\t}\n\t\t\toptions._catchError(e, newVNode, oldVNode);\n\t\t}\n\t} else if (\n\t\texcessDomChildren == NULL &&\n\t\tnewVNode._original == oldVNode._original\n\t) {\n\t\tnewVNode._children = oldVNode._children;\n\t\tnewVNode._dom = oldVNode._dom;\n\t} else {\n\t\toldDom = newVNode._dom = diffElementNodes(\n\t\t\toldVNode._dom,\n\t\t\tnewVNode,\n\t\t\toldVNode,\n\t\t\tglobalContext,\n\t\t\tnamespace,\n\t\t\texcessDomChildren,\n\t\t\tcommitQueue,\n\t\t\tisHydrating,\n\t\t\trefQueue\n\t\t);\n\t}\n\n\tif ((tmp = options.diffed)) tmp(newVNode);\n\n\treturn newVNode._flags & MODE_SUSPENDED ? undefined : oldDom;\n}\n\nfunction markAsForce(vnode) {\n\tif (vnode && vnode._component) vnode._component._force = true;\n\tif (vnode && vnode._children) vnode._children.forEach(markAsForce);\n}\n\n/**\n * @param {Array<Component>} commitQueue List of components\n * which have callbacks to invoke in commitRoot\n * @param {VNode} root\n */\nexport function commitRoot(commitQueue, root, refQueue) {\n\tfor (let i = 0; i < refQueue.length; i++) {\n\t\tapplyRef(refQueue[i], refQueue[++i], refQueue[++i]);\n\t}\n\n\tif (options._commit) options._commit(root, commitQueue);\n\n\tcommitQueue.some(c => {\n\t\ttry {\n\t\t\t// @ts-expect-error Reuse the commitQueue variable here so the type changes\n\t\t\tcommitQueue = c._renderCallbacks;\n\t\t\tc._renderCallbacks = [];\n\t\t\tcommitQueue.some(cb => {\n\t\t\t\t// @ts-expect-error See above comment on commitQueue\n\t\t\t\tcb.call(c);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\toptions._catchError(e, c._vnode);\n\t\t}\n\t});\n}\n\nfunction cloneNode(node) {\n\tif (\n\t\ttypeof node != 'object' ||\n\t\tnode == NULL ||\n\t\t(node._depth && node._depth > 0)\n\t) {\n\t\treturn node;\n\t}\n\n\tif (isArray(node)) {\n\t\treturn node.map(cloneNode);\n\t}\n\n\treturn assign({}, node);\n}\n\n/**\n * Diff two virtual nodes representing DOM element\n * @param {PreactElement} dom The DOM element representing the virtual nodes\n * being diffed\n * @param {VNode} newVNode The new virtual node\n * @param {VNode} oldVNode The old virtual node\n * @param {object} globalContext The current context object\n * @param {string} namespace Current namespace of the DOM node (HTML, SVG, or MathML)\n * @param {Array<PreactElement>} excessDomChildren\n * @param {Array<Component>} commitQueue List of components which have callbacks\n * to invoke in commitRoot\n * @param {boolean} isHydrating Whether or not we are in hydration\n * @param {any[]} refQueue an array of elements needed to invoke refs\n * @returns {PreactElement}\n */\nfunction diffElementNodes(\n\tdom,\n\tnewVNode,\n\toldVNode,\n\tglobalContext,\n\tnamespace,\n\texcessDomChildren,\n\tcommitQueue,\n\tisHydrating,\n\trefQueue\n) {\n\tlet oldProps = oldVNode.props || EMPTY_OBJ;\n\tlet newProps = newVNode.props;\n\tlet nodeType = /** @type {string} */ (newVNode.type);\n\t/** @type {any} */\n\tlet i;\n\t/** @type {{ __html?: string }} */\n\tlet newHtml;\n\t/** @type {{ __html?: string }} */\n\tlet oldHtml;\n\t/** @type {ComponentChildren} */\n\tlet newChildren;\n\tlet value;\n\tlet inputValue;\n\tlet checked;\n\n\t// Tracks entering and exiting namespaces when descending through the tree.\n\tif (nodeType == 'svg') namespace = SVG_NAMESPACE;\n\telse if (nodeType == 'math') namespace = MATH_NAMESPACE;\n\telse if (!namespace) namespace = XHTML_NAMESPACE;\n\n\tif (excessDomChildren != NULL) {\n\t\tfor (i = 0; i < excessDomChildren.length; i++) {\n\t\t\tvalue = excessDomChildren[i];\n\n\t\t\t// if newVNode matches an element in excessDomChildren or the `dom`\n\t\t\t// argument matches an element in excessDomChildren, remove it from\n\t\t\t// excessDomChildren so it isn't later removed in diffChildren\n\t\t\tif (\n\t\t\t\tvalue &&\n\t\t\t\t'setAttribute' in value == !!nodeType &&\n\t\t\t\t(nodeType ? value.localName == nodeType : value.nodeType == 3)\n\t\t\t) {\n\t\t\t\tdom = value;\n\t\t\t\texcessDomChildren[i] = NULL;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (dom == NULL) {\n\t\tif (nodeType == NULL) {\n\t\t\treturn document.createTextNode(newProps);\n\t\t}\n\n\t\tdom = document.createElementNS(\n\t\t\tnamespace,\n\t\t\tnodeType,\n\t\t\tnewProps.is && newProps\n\t\t);\n\n\t\t// we are creating a new node, so we can assume this is a new subtree (in\n\t\t// case we are hydrating), this deopts the hydrate\n\t\tif (isHydrating) {\n\t\t\tif (options._hydrationMismatch)\n\t\t\t\toptions._hydrationMismatch(newVNode, excessDomChildren);\n\t\t\tisHydrating = false;\n\t\t}\n\t\t// we created a new parent, so none of the previously attached children can be reused:\n\t\texcessDomChildren = NULL;\n\t}\n\n\tif (nodeType == NULL) {\n\t\t// During hydration, we still have to split merged text from SSR'd HTML.\n\t\tif (oldProps !== newProps && (!isHydrating || dom.data != newProps)) {\n\t\t\tdom.data = newProps;\n\t\t}\n\t} else {\n\t\t// If excessDomChildren was not null, repopulate it with the current element's children:\n\t\texcessDomChildren = excessDomChildren && slice.call(dom.childNodes);\n\n\t\t// If we are in a situation where we are not hydrating but are using\n\t\t// existing DOM (e.g. replaceNode) we should read the existing DOM\n\t\t// attributes to diff them\n\t\tif (!isHydrating && excessDomChildren != NULL) {\n\t\t\toldProps = {};\n\t\t\tfor (i = 0; i < dom.attributes.length; i++) {\n\t\t\t\tvalue = dom.attributes[i];\n\t\t\t\toldProps[value.name] = value.value;\n\t\t\t}\n\t\t}\n\n\t\tfor (i in oldProps) {\n\t\t\tvalue = oldProps[i];\n\t\t\tif (i == 'children') {\n\t\t\t} else if (i == 'dangerouslySetInnerHTML') {\n\t\t\t\toldHtml = value;\n\t\t\t} else if (!(i in newProps)) {\n\t\t\t\tif (\n\t\t\t\t\t(i == 'value' && 'defaultValue' in newProps) ||\n\t\t\t\t\t(i == 'checked' && 'defaultChecked' in newProps)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tsetProperty(dom, i, NULL, value, namespace);\n\t\t\t}\n\t\t}\n\n\t\t// During hydration, props are not diffed at all (including dangerouslySetInnerHTML)\n\t\t// @TODO we should warn in debug mode when props don't match here.\n\t\tfor (i in newProps) {\n\t\t\tvalue = newProps[i];\n\t\t\tif (i == 'children') {\n\t\t\t\tnewChildren = value;\n\t\t\t} else if (i == 'dangerouslySetInnerHTML') {\n\t\t\t\tnewHtml = value;\n\t\t\t} else if (i == 'value') {\n\t\t\t\tinputValue = value;\n\t\t\t} else if (i == 'checked') {\n\t\t\t\tchecked = value;\n\t\t\t} else if (\n\t\t\t\t(!isHydrating || typeof value == 'function') &&\n\t\t\t\toldProps[i] !== value\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, value, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\n\t\t// If the new vnode didn't have dangerouslySetInnerHTML, diff its children\n\t\tif (newHtml) {\n\t\t\t// Avoid re-applying the same '__html' if it did not changed between re-render\n\t\t\tif (\n\t\t\t\t!isHydrating &&\n\t\t\t\t(!oldHtml ||\n\t\t\t\t\t(newHtml.__html != oldHtml.__html && newHtml.__html != dom.innerHTML))\n\t\t\t) {\n\t\t\t\tdom.innerHTML = newHtml.__html;\n\t\t\t}\n\n\t\t\tnewVNode._children = [];\n\t\t} else {\n\t\t\tif (oldHtml) dom.innerHTML = '';\n\n\t\t\tdiffChildren(\n\t\t\t\t// @ts-expect-error\n\t\t\t\tnewVNode.type == 'template' ? dom.content : dom,\n\t\t\t\tisArray(newChildren) ? newChildren : [newChildren],\n\t\t\t\tnewVNode,\n\t\t\t\toldVNode,\n\t\t\t\tglobalContext,\n\t\t\t\tnodeType == 'foreignObject' ? XHTML_NAMESPACE : namespace,\n\t\t\t\texcessDomChildren,\n\t\t\t\tcommitQueue,\n\t\t\t\texcessDomChildren\n\t\t\t\t\t? excessDomChildren[0]\n\t\t\t\t\t: oldVNode._children && getDomSibling(oldVNode, 0),\n\t\t\t\tisHydrating,\n\t\t\t\trefQueue\n\t\t\t);\n\n\t\t\t// Remove children that are not part of any vnode.\n\t\t\tif (excessDomChildren != NULL) {\n\t\t\t\tfor (i = excessDomChildren.length; i--; ) {\n\t\t\t\t\tremoveNode(excessDomChildren[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// As above, don't diff props during hydration\n\t\tif (!isHydrating) {\n\t\t\ti = 'value';\n\t\t\tif (nodeType == 'progress' && inputValue == NULL) {\n\t\t\t\tdom.removeAttribute('value');\n\t\t\t} else if (\n\t\t\t\tinputValue != UNDEFINED &&\n\t\t\t\t// #2756 For the <progress>-element the initial value is 0,\n\t\t\t\t// despite the attribute not being present. When the attribute\n\t\t\t\t// is missing the progress bar is treated as indeterminate.\n\t\t\t\t// To fix that we'll always update it when it is 0 for progress elements\n\t\t\t\t(inputValue !== dom[i] ||\n\t\t\t\t\t(nodeType == 'progress' && !inputValue) ||\n\t\t\t\t\t// This is only for IE 11 to fix <select> value not being updated.\n\t\t\t\t\t// To avoid a stale select value we need to set the option.value\n\t\t\t\t\t// again, which triggers IE11 to re-evaluate the select value\n\t\t\t\t\t(nodeType == 'option' && inputValue != oldProps[i]))\n\t\t\t) {\n\t\t\t\tsetProperty(dom, i, inputValue, oldProps[i], namespace);\n\t\t\t}\n\n\t\t\ti = 'checked';\n\t\t\tif (checked != UNDEFINED && checked != dom[i]) {\n\t\t\t\tsetProperty(dom, i, checked, oldProps[i], namespace);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn dom;\n}\n\n/**\n * Invoke or update a ref, depending on whether it is a function or object ref.\n * @param {Ref<any> & { _unmount?: unknown }} ref\n * @param {any} value\n * @param {VNode} vnode\n */\nexport function applyRef(ref, value, vnode) {\n\ttry {\n\t\tif (typeof ref == 'function') {\n\t\t\tlet hasRefUnmount = typeof ref._unmount == 'function';\n\t\t\tif (hasRefUnmount) {\n\t\t\t\t// @ts-ignore TS doesn't like moving narrowing checks into variables\n\t\t\t\tref._unmount();\n\t\t\t}\n\n\t\t\tif (!hasRefUnmount || value != NULL) {\n\t\t\t\t// Store the cleanup function on the function\n\t\t\t\t// instance object itself to avoid shape\n\t\t\t\t// transitioning vnode\n\t\t\t\tref._unmount = ref(value);\n\t\t\t}\n\t\t} else ref.current = value;\n\t} catch (e) {\n\t\toptions._catchError(e, vnode);\n\t}\n}\n\n/**\n * Unmount a virtual node from the tree and apply DOM changes\n * @param {VNode} vnode The virtual node to unmount\n * @param {VNode} parentVNode The parent of the VNode that initiated the unmount\n * @param {boolean} [skipRemove] Flag that indicates that a parent node of the\n * current element is already detached from the DOM.\n */\nexport function unmount(vnode, parentVNode, skipRemove) {\n\tlet r;\n\tif (options.unmount) options.unmount(vnode);\n\n\tif ((r = vnode.ref)) {\n\t\tif (!r.current || r.current == vnode._dom) {\n\t\t\tapplyRef(r, NULL, parentVNode);\n\t\t}\n\t}\n\n\tif ((r = vnode._component) != NULL) {\n\t\tif (r.componentWillUnmount) {\n\t\t\ttry {\n\t\t\t\tr.componentWillUnmount();\n\t\t\t} catch (e) {\n\t\t\t\toptions._catchError(e, parentVNode);\n\t\t\t}\n\t\t}\n\n\t\tr.base = r._parentDom = NULL;\n\t}\n\n\tif ((r = vnode._children)) {\n\t\tfor (let i = 0; i < r.length; i++) {\n\t\t\tif (r[i]) {\n\t\t\t\tunmount(\n\t\t\t\t\tr[i],\n\t\t\t\t\tparentVNode,\n\t\t\t\t\tskipRemove || typeof vnode.type != 'function'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!skipRemove) {\n\t\tremoveNode(vnode._dom);\n\t}\n\n\tvnode._component = vnode._parent = vnode._dom = UNDEFINED;\n}\n\n/** The `.render()` method for a PFC backing instance. */\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n","import { EMPTY_OBJ, NULL } from './constants';\nimport { commitRoot, diff } from './diff/index';\nimport { createElement, Fragment } from './create-element';\nimport options from './options';\nimport { slice } from './util';\n\n/**\n * Render a Preact virtual node into a DOM element\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to render into\n * @param {import('./internal').PreactElement | object} [replaceNode] Optional: Attempt to re-use an\n * existing DOM tree rooted at `replaceNode`\n */\nexport function render(vnode, parentDom, replaceNode) {\n\t// https://github.com/preactjs/preact/issues/3794\n\tif (parentDom == document) {\n\t\tparentDom = document.documentElement;\n\t}\n\n\tif (options._root) options._root(vnode, parentDom);\n\n\t// We abuse the `replaceNode` parameter in `hydrate()` to signal if we are in\n\t// hydration mode or not by passing the `hydrate` function instead of a DOM\n\t// element..\n\tlet isHydrating = typeof replaceNode == 'function';\n\n\t// To be able to support calling `render()` multiple times on the same\n\t// DOM node, we need to obtain a reference to the previous tree. We do\n\t// this by assigning a new `_children` property to DOM nodes which points\n\t// to the last rendered tree. By default this property is not present, which\n\t// means that we are mounting a new tree for the first time.\n\tlet oldVNode = isHydrating\n\t\t? NULL\n\t\t: (replaceNode && replaceNode._children) || parentDom._children;\n\n\tvnode = ((!isHydrating && replaceNode) || parentDom)._children =\n\t\tcreateElement(Fragment, NULL, [vnode]);\n\n\t// List of effects that need to be called after diffing.\n\tlet commitQueue = [],\n\t\trefQueue = [];\n\tdiff(\n\t\tparentDom,\n\t\t// Determine the new vnode tree and store it on the DOM element on\n\t\t// our custom `_children` property.\n\t\tvnode,\n\t\toldVNode || EMPTY_OBJ,\n\t\tEMPTY_OBJ,\n\t\tparentDom.namespaceURI,\n\t\t!isHydrating && replaceNode\n\t\t\t? [replaceNode]\n\t\t\t: oldVNode\n\t\t\t\t? NULL\n\t\t\t\t: parentDom.firstChild\n\t\t\t\t\t? slice.call(parentDom.childNodes)\n\t\t\t\t\t: NULL,\n\t\tcommitQueue,\n\t\t!isHydrating && replaceNode\n\t\t\t? replaceNode\n\t\t\t: oldVNode\n\t\t\t\t? oldVNode._dom\n\t\t\t\t: parentDom.firstChild,\n\t\tisHydrating,\n\t\trefQueue\n\t);\n\n\t// Flush all queued effects\n\tcommitRoot(commitQueue, vnode, refQueue);\n}\n\n/**\n * Update an existing DOM element with data from a Preact virtual node\n * @param {import('./internal').ComponentChild} vnode The virtual node to render\n * @param {import('./internal').PreactElement} parentDom The DOM element to update\n */\nexport function hydrate(vnode, parentDom) {\n\trender(vnode, parentDom, hydrate);\n}\n","import { assign, slice } from './util';\nimport { createVNode } from './create-element';\nimport { NULL, UNDEFINED } from './constants';\n\n/**\n * Clones the given VNode, optionally adding attributes/props and replacing its\n * children.\n * @param {import('./internal').VNode} vnode The virtual DOM element to clone\n * @param {object} props Attributes/props to add when cloning\n * @param {Array<import('./internal').ComponentChildren>} rest Any additional arguments will be used\n * as replacement children.\n * @returns {import('./internal').VNode}\n */\nexport function cloneElement(vnode, props, children) {\n\tlet normalizedProps = assign({}, vnode.props),\n\t\tkey,\n\t\tref,\n\t\ti;\n\n\tlet defaultProps;\n\n\tif (vnode.type && vnode.type.defaultProps) {\n\t\tdefaultProps = vnode.type.defaultProps;\n\t}\n\n\tfor (i in props) {\n\t\tif (i == 'key') key = props[i];\n\t\telse if (i == 'ref') ref = props[i];\n\t\telse if (props[i] === UNDEFINED && defaultProps != UNDEFINED) {\n\t\t\tnormalizedProps[i] = defaultProps[i];\n\t\t} else {\n\t\t\tnormalizedProps[i] = props[i];\n\t\t}\n\t}\n\n\tif (arguments.length > 2) {\n\t\tnormalizedProps.children =\n\t\t\targuments.length > 3 ? slice.call(arguments, 2) : children;\n\t}\n\n\treturn createVNode(\n\t\tvnode.type,\n\t\tnormalizedProps,\n\t\tkey || vnode.key,\n\t\tref || vnode.ref,\n\t\tNULL\n\t);\n}\n","import { NULL } from '../constants';\n\n/**\n * Find the closest error boundary to a thrown error and call it\n * @param {object} error The thrown value\n * @param {import('../internal').VNode} vnode The vnode that threw the error that was caught (except\n * for unmounting when this parameter is the highest parent that was being\n * unmounted)\n * @param {import('../internal').VNode} [oldVNode]\n * @param {import('../internal').ErrorInfo} [errorInfo]\n */\nexport function _catchError(error, vnode, oldVNode, errorInfo) {\n\t/** @type {import('../internal').Component} */\n\tlet component,\n\t\t/** @type {import('../internal').ComponentType} */\n\t\tctor,\n\t\t/** @type {boolean} */\n\t\thandled;\n\n\tfor (; (vnode = vnode._parent); ) {\n\t\tif ((component = vnode._component) && !component._processingException) {\n\t\t\ttry {\n\t\t\t\tctor = component.constructor;\n\n\t\t\t\tif (ctor && ctor.getDerivedStateFromError != NULL) {\n\t\t\t\t\tcomponent.setState(ctor.getDerivedStateFromError(error));\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\tif (component.componentDidCatch != NULL) {\n\t\t\t\t\tcomponent.componentDidCatch(error, errorInfo || {});\n\t\t\t\t\thandled = component._dirty;\n\t\t\t\t}\n\n\t\t\t\t// This is an error boundary. Mark it as having bailed out, and whether it was mid-hydration.\n\t\t\t\tif (handled) {\n\t\t\t\t\treturn (component._pendingError = component);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terror = e;\n\t\t\t}\n\t\t}\n\t}\n\n\tthrow error;\n}\n","/**\n * Simple event emitter for widget lifecycle events\n * Provides on() and off() methods for subscribing to events\n */\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<EventMap extends Record<string, any>> {\n private listeners: Map<keyof EventMap, Set<EventCallback<unknown>>> =\n new Map();\n\n /**\n * Subscribe to an event\n * @returns Unsubscribe function\n */\n on<K extends keyof EventMap>(\n event: K,\n callback: EventCallback<EventMap[K]>,\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => this.off(event, callback);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n callback: EventCallback<EventMap[K]>,\n ): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n eventListeners.delete(callback as EventCallback<unknown>);\n }\n }\n\n /**\n * Emit an event to all subscribers\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const eventListeners = this.listeners.get(event);\n if (eventListeners) {\n eventListeners.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(\n `Error in event handler for \"${String(event)}\":`,\n error,\n );\n }\n });\n }\n }\n\n /**\n * Remove all listeners for a specific event or all events\n */\n removeAllListeners(event?: keyof EventMap): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n}\n","/**\n * Event Batcher\n * Queues events and flushes them in batches to reduce HTTP overhead\n */\n\nimport type { TrackedEvent } from \"../types\";\n\nexport interface BatcherConfig {\n /** Maximum events per batch (default: 10) */\n maxBatchSize?: number;\n /** Time in ms to wait before flushing a partial batch (default: 5000) */\n flushInterval?: number;\n /** Maximum events to queue before forcing a flush (default: 100) */\n maxQueueSize?: number;\n}\n\nconst DEFAULT_CONFIG: Required<BatcherConfig> = {\n maxBatchSize: 10,\n flushInterval: 5000,\n maxQueueSize: 100,\n};\n\nexport type FlushCallback = (events: TrackedEvent[]) => Promise<void>;\n\n/**\n * Event batcher that queues events and flushes them periodically\n */\nexport class EventBatcher {\n private queue: TrackedEvent[] = [];\n private config: Required<BatcherConfig>;\n private flushCallback: FlushCallback;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private isFlushing: boolean = false;\n\n constructor(flushCallback: FlushCallback, config: BatcherConfig = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.flushCallback = flushCallback;\n }\n\n /**\n * Add an event to the queue\n */\n add(event: TrackedEvent): void {\n this.queue.push(event);\n\n // If queue is full, flush immediately\n if (this.queue.length >= this.config.maxQueueSize) {\n this.flush();\n return;\n }\n\n // If batch is ready, flush\n if (this.queue.length >= this.config.maxBatchSize) {\n this.flush();\n return;\n }\n\n // Schedule flush if not already scheduled\n this.scheduleFlush();\n }\n\n /**\n * Add multiple events to the queue\n */\n addMany(events: TrackedEvent[]): void {\n events.forEach((event) => this.add(event));\n }\n\n /**\n * Flush all queued events immediately\n */\n async flush(): Promise<void> {\n // Prevent concurrent flushes\n if (this.isFlushing) return;\n\n // Cancel scheduled flush\n this.cancelScheduledFlush();\n\n // Get events to flush\n const eventsToFlush = this.queue.splice(0, this.config.maxBatchSize);\n if (eventsToFlush.length === 0) return;\n\n this.isFlushing = true;\n\n try {\n await this.flushCallback(eventsToFlush);\n } catch (error) {\n // Put events back at the front of the queue for retry\n this.queue.unshift(...eventsToFlush);\n throw error;\n } finally {\n this.isFlushing = false;\n\n // If there are more events, schedule another flush\n if (this.queue.length > 0) {\n this.scheduleFlush();\n }\n }\n }\n\n /**\n * Get the current queue size\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * Clear the queue\n */\n clear(): void {\n this.queue = [];\n this.cancelScheduledFlush();\n }\n\n /**\n * Get queued events (for persistence)\n */\n getQueue(): TrackedEvent[] {\n return [...this.queue];\n }\n\n /**\n * Restore queue from persistence\n */\n restoreQueue(events: TrackedEvent[]): void {\n this.queue = [...events, ...this.queue];\n if (this.queue.length > 0) {\n this.scheduleFlush();\n }\n }\n\n /**\n * Destroy the batcher and clear timers\n */\n destroy(): void {\n this.cancelScheduledFlush();\n this.queue = [];\n }\n\n // Private methods\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) return;\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush().catch(() => {\n // Error is logged in flush(), schedule retry\n this.scheduleFlush();\n });\n }, this.config.flushInterval);\n }\n\n private cancelScheduledFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n}\n","/**\n * Base API client for GetForty backend\n * Handles HTTP requests with error handling\n */\n\nconst DEFAULT_API_BASE = \"https://getforty.club\";\nconst DEFAULT_TIMEOUT = 30000; // 30 seconds\n\nexport interface ApiClientConfig {\n baseUrl?: string;\n timeout?: number;\n debug?: boolean;\n}\n\nexport interface ApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string;\n status?: number;\n}\n\nexport class ApiClient {\n private baseUrl: string;\n private timeout: number;\n private debug: boolean;\n\n constructor(config: ApiClientConfig = {}) {\n this.baseUrl = config.baseUrl || DEFAULT_API_BASE;\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n this.debug = config.debug || false;\n }\n\n /**\n * Make a POST request to the API\n */\n async post<TInput, TOutput>(\n endpoint: string,\n data: TInput,\n ): Promise<ApiResponse<TOutput>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n if (this.debug) {\n console.log(\"[GetForty] POST\", url, data);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n\n if (!response.ok) {\n if (this.debug) {\n console.error(\"[GetForty] API Error:\", response.status, json);\n }\n return {\n success: false,\n error: json.error || `HTTP ${response.status}`,\n status: response.status,\n };\n }\n\n if (this.debug) {\n console.log(\"[GetForty] Response:\", json);\n }\n\n return {\n success: true,\n data: json,\n status: response.status,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timeout\",\n status: 408,\n };\n }\n\n if (this.debug) {\n console.error(\"[GetForty] Network Error:\", error.message);\n }\n\n return {\n success: false,\n error: error.message || \"Network error\",\n status: 0,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error\",\n status: 0,\n };\n }\n }\n\n /**\n * Make a GET request to the API (for future use)\n */\n async get<TOutput>(endpoint: string): Promise<ApiResponse<TOutput>> {\n const url = `${this.baseUrl}${endpoint}`;\n\n if (this.debug) {\n console.log(\"[GetForty] GET\", url);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const json = await response.json();\n\n if (!response.ok) {\n return {\n success: false,\n error: json.error || `HTTP ${response.status}`,\n status: response.status,\n };\n }\n\n return {\n success: true,\n data: json,\n status: response.status,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return {\n success: false,\n error: \"Request timeout\",\n status: 408,\n };\n }\n\n return {\n success: false,\n error: error.message || \"Network error\",\n status: 0,\n };\n }\n\n return {\n success: false,\n error: \"Unknown error\",\n status: 0,\n };\n }\n }\n\n /**\n * Update the base URL (useful for development)\n */\n setBaseUrl(url: string): void {\n this.baseUrl = url;\n }\n\n /**\n * Check if we're online\n */\n isOnline(): boolean {\n return typeof navigator !== \"undefined\" ? navigator.onLine : true;\n }\n}\n","/**\n * Events API Client\n * Handles sending events to the GetForty backend\n */\n\nimport { ApiClient, type ApiResponse } from \"./client\";\nimport type { TrackedEvent } from \"../types\";\n\ninterface TrackEventResponse {\n success: boolean;\n eventId: string;\n}\n\ninterface TrackBatchResponse {\n success: boolean;\n accepted: number;\n eventIds: string[];\n rejected?: number;\n errors?: Array<{ index: number; error: string }>;\n}\n\ninterface IdentifyResponse {\n success: boolean;\n trackedUserId: string;\n eventsLinked: number;\n respondentsLinked: number;\n}\n\nexport interface EventsApiConfig {\n baseUrl?: string;\n debug?: boolean;\n}\n\n/**\n * Events API client for tracking events\n */\nexport class EventsApi {\n private client: ApiClient;\n private trackingId: string;\n private debug: boolean;\n\n constructor(trackingId: string, config: EventsApiConfig = {}) {\n this.trackingId = trackingId;\n this.debug = config.debug || false;\n this.client = new ApiClient({\n baseUrl: config.baseUrl,\n debug: config.debug,\n });\n }\n\n /**\n * Track a single event\n */\n async trackEvent(\n event: TrackedEvent,\n ): Promise<ApiResponse<TrackEventResponse>> {\n return this.client.post<\n {\n trackingId: string;\n eventName: string;\n properties?: Record<string, unknown>;\n sessionId?: string;\n userId?: string;\n },\n TrackEventResponse\n >(\"/api/v1/events\", {\n trackingId: this.trackingId,\n eventName: event.eventName,\n properties: event.properties,\n sessionId: event.sessionId,\n userId: event.userId,\n });\n }\n\n /**\n * Track multiple events in a batch\n */\n async trackBatch(\n events: TrackedEvent[],\n ): Promise<ApiResponse<TrackBatchResponse>> {\n if (this.debug) {\n console.log(\"[GetForty] Sending batch of\", events.length, \"events\");\n }\n\n return this.client.post<\n {\n trackingId: string;\n events: Array<{\n eventName: string;\n properties?: Record<string, unknown>;\n sessionId?: string;\n userId?: string;\n }>;\n },\n TrackBatchResponse\n >(\"/api/v1/events/batch\", {\n trackingId: this.trackingId,\n events: events.map((event) => ({\n eventName: event.eventName,\n properties: event.properties,\n sessionId: event.sessionId,\n userId: event.userId,\n })),\n });\n }\n\n /**\n * Identify a user with traits\n * Links events and respondents to the user\n */\n async identify(\n userId: string,\n traits?: Record<string, unknown>,\n anonymousId?: string,\n ): Promise<ApiResponse<IdentifyResponse>> {\n if (this.debug) {\n console.log(\"[GetForty] Identifying user:\", userId);\n }\n\n return this.client.post<\n {\n trackingId: string;\n userId: string;\n traits?: Record<string, unknown>;\n anonymousId?: string;\n },\n IdentifyResponse\n >(\"/api/v1/identify\", {\n trackingId: this.trackingId,\n userId,\n traits,\n anonymousId,\n });\n }\n\n /**\n * Check if we're online\n */\n isOnline(): boolean {\n return this.client.isOnline();\n }\n}\n","/**\n * Session ID Management\n * Generates, persists, and retrieves session IDs for event grouping\n */\n\nconst SESSION_STORAGE_KEY = \"gf_session_id\";\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): string {\n // Use crypto.randomUUID if available, fallback to random string\n if (typeof crypto !== \"undefined\" && crypto.randomUUID) {\n return `sess_${crypto.randomUUID().replace(/-/g, \"\").substring(0, 16)}`;\n }\n\n // Fallback for older browsers\n const chars =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n let result = \"sess_\";\n for (let i = 0; i < 16; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\n/**\n * Get session ID from storage, or generate a new one\n */\nexport function getOrCreateSessionId(): string {\n // Try to get from sessionStorage\n if (typeof sessionStorage !== \"undefined\") {\n try {\n const stored = sessionStorage.getItem(SESSION_STORAGE_KEY);\n if (stored) {\n return stored;\n }\n } catch {\n // Storage access failed, generate new\n }\n }\n\n // Generate new session ID\n const sessionId = generateSessionId();\n\n // Try to persist\n persistSessionId(sessionId);\n\n return sessionId;\n}\n\n/**\n * Persist session ID to sessionStorage\n */\nexport function persistSessionId(sessionId: string): void {\n if (typeof sessionStorage === \"undefined\") return;\n\n try {\n sessionStorage.setItem(SESSION_STORAGE_KEY, sessionId);\n } catch {\n // Ignore storage errors (quota exceeded, private mode, etc.)\n }\n}\n\n/**\n * Clear session ID from storage\n */\nexport function clearSessionId(): void {\n if (typeof sessionStorage === \"undefined\") return;\n\n try {\n sessionStorage.removeItem(SESSION_STORAGE_KEY);\n } catch {\n // Ignore errors\n }\n}\n","/**\n * Retry Logic with Exponential Backoff\n * Handles retrying failed requests with increasing delays\n */\n\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries?: number;\n /** Initial delay in ms before first retry (default: 1000) */\n initialDelay?: number;\n /** Maximum delay in ms between retries (default: 30000) */\n maxDelay?: number;\n /** Multiplier for exponential backoff (default: 2) */\n backoffMultiplier?: number;\n}\n\nconst DEFAULT_CONFIG: Required<RetryConfig> = {\n maxRetries: 3,\n initialDelay: 1000,\n maxDelay: 30000,\n backoffMultiplier: 2,\n};\n\n/**\n * Calculate delay for a given retry attempt\n */\nexport function calculateBackoffDelay(\n attempt: number,\n config: RetryConfig = {},\n): number {\n const { initialDelay, maxDelay, backoffMultiplier } = {\n ...DEFAULT_CONFIG,\n ...config,\n };\n\n // Exponential backoff with jitter\n const exponentialDelay = initialDelay * Math.pow(backoffMultiplier, attempt);\n const jitter = Math.random() * 0.3 * exponentialDelay; // Add up to 30% jitter\n\n return Math.min(exponentialDelay + jitter, maxDelay);\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig = {},\n): Promise<T> {\n const { maxRetries } = { ...DEFAULT_CONFIG, ...config };\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on the last attempt\n if (attempt < maxRetries) {\n const delay = calculateBackoffDelay(attempt, config);\n await sleep(delay);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Check if an error is retryable\n * Network errors and 5xx server errors are retryable\n */\nexport function isRetryableError(status: number): boolean {\n // Network error (status 0) or server error (5xx)\n return status === 0 || (status >= 500 && status < 600);\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Throttle and Rate Limiting Utilities\n * Prevents client-side spam and manages submission cooldowns\n */\n\nconst THROTTLE_STORAGE_KEY = \"gf_last_submit\";\n\n/**\n * Default throttle configuration\n */\nexport const DEFAULT_THROTTLE_CONFIG = {\n /** Minimum time between form submissions in ms (30 seconds) */\n submissionCooldown: 30000,\n /** Maximum events per minute */\n maxEventsPerMinute: 60,\n /** Rate limit window in ms (1 minute) */\n rateLimitWindow: 60000,\n};\n\n/**\n * Check if enough time has passed since last form submission\n */\nexport function canSubmitForm(): boolean {\n if (typeof localStorage === \"undefined\") return true;\n\n try {\n const lastSubmit = localStorage.getItem(THROTTLE_STORAGE_KEY);\n if (!lastSubmit) return true;\n\n const elapsed = Date.now() - parseInt(lastSubmit, 10);\n return elapsed > DEFAULT_THROTTLE_CONFIG.submissionCooldown;\n } catch {\n return true;\n }\n}\n\n/**\n * Get remaining cooldown time in seconds\n */\nexport function getSubmissionCooldown(): number {\n if (typeof localStorage === \"undefined\") return 0;\n\n try {\n const lastSubmit = localStorage.getItem(THROTTLE_STORAGE_KEY);\n if (!lastSubmit) return 0;\n\n const elapsed = Date.now() - parseInt(lastSubmit, 10);\n const remaining = DEFAULT_THROTTLE_CONFIG.submissionCooldown - elapsed;\n\n return remaining > 0 ? Math.ceil(remaining / 1000) : 0;\n } catch {\n return 0;\n }\n}\n\n/**\n * Record a form submission timestamp\n */\nexport function recordSubmission(): void {\n if (typeof localStorage === \"undefined\") return;\n\n try {\n localStorage.setItem(THROTTLE_STORAGE_KEY, Date.now().toString());\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Simple in-memory event rate limiter\n */\nclass EventRateLimiter {\n private eventTimestamps: number[] = [];\n private config = DEFAULT_THROTTLE_CONFIG;\n\n /**\n * Check if an event can be tracked\n */\n canTrack(): boolean {\n this.cleanOldTimestamps();\n return this.eventTimestamps.length < this.config.maxEventsPerMinute;\n }\n\n /**\n * Record an event\n */\n recordEvent(): void {\n this.cleanOldTimestamps();\n this.eventTimestamps.push(Date.now());\n }\n\n /**\n * Get remaining events allowed in current window\n */\n getRemainingEvents(): number {\n this.cleanOldTimestamps();\n return Math.max(\n 0,\n this.config.maxEventsPerMinute - this.eventTimestamps.length,\n );\n }\n\n /**\n * Remove timestamps outside the rate limit window\n */\n private cleanOldTimestamps(): void {\n const windowStart = Date.now() - this.config.rateLimitWindow;\n this.eventTimestamps = this.eventTimestamps.filter(\n (ts) => ts > windowStart,\n );\n }\n}\n\n// Singleton rate limiter instance\nexport const eventRateLimiter = new EventRateLimiter();\n\n/**\n * Check if an event can be tracked (rate limit check)\n */\nexport function canTrackEvent(): boolean {\n return eventRateLimiter.canTrack();\n}\n\n/**\n * Record an event for rate limiting\n */\nexport function recordEventTracked(): void {\n eventRateLimiter.recordEvent();\n}\n","/**\n * Main Event Tracker\n * Orchestrates session management, batching, retry, and API calls\n */\n\nimport { EventBatcher, type BatcherConfig } from \"./batcher\";\nimport { EventsApi, type EventsApiConfig } from \"../api/events\";\nimport { getOrCreateSessionId } from \"./session\";\nimport { withRetry, isRetryableError, type RetryConfig } from \"./retry\";\nimport { canTrackEvent, recordEventTracked } from \"../utils/throttle\";\nimport type { TrackedEvent, TrackingState } from \"../types\";\n\nexport interface TrackerConfig\n extends BatcherConfig,\n EventsApiConfig,\n RetryConfig {\n /** Tracking ID */\n trackingId: string;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n/**\n * Event tracker that manages the full tracking lifecycle\n */\nexport class Tracker {\n private config: TrackerConfig;\n private api: EventsApi;\n private batcher: EventBatcher;\n private state: TrackingState;\n private debug: boolean;\n\n constructor(config: TrackerConfig) {\n this.config = config;\n this.debug = config.debug || false;\n\n // Initialize state\n this.state = {\n sessionId: getOrCreateSessionId(),\n userId: null,\n userTraits: {},\n eventQueue: [],\n isFlushing: false,\n isOnline: typeof navigator !== \"undefined\" ? navigator.onLine : true,\n };\n\n // Initialize API client\n this.api = new EventsApi(config.trackingId, {\n baseUrl: config.baseUrl,\n debug: config.debug,\n });\n\n // Initialize batcher with flush callback\n this.batcher = new EventBatcher(\n async (events) => this.sendEvents(events),\n config,\n );\n\n // Setup online/offline listeners\n this.setupOnlineListeners();\n\n if (this.debug) {\n console.log(\"[GetForty Tracker] Initialized\", {\n sessionId: this.state.sessionId,\n trackingId: config.trackingId,\n });\n }\n }\n\n /**\n * Track an event\n */\n track(eventName: string, properties?: Record<string, unknown>): void {\n // Check rate limit\n if (!canTrackEvent()) {\n if (this.debug) {\n console.warn(\n \"[GetForty Tracker] Rate limit exceeded, event dropped:\",\n eventName,\n );\n }\n return;\n }\n\n // Create tracked event\n const event: TrackedEvent = {\n eventName,\n properties,\n sessionId: this.state.sessionId,\n userId: this.state.userId || undefined,\n timestamp: new Date().toISOString(),\n };\n\n // Record for rate limiting\n recordEventTracked();\n\n // Add to batcher\n if (this.state.isOnline) {\n this.batcher.add(event);\n } else {\n // Queue for later when offline\n this.state.eventQueue.push(event);\n this.persistOfflineQueue();\n }\n\n if (this.debug) {\n console.log(\"[GetForty Tracker] Event tracked:\", event);\n }\n }\n\n /**\n * Identify a user\n * Sends user data to backend and links events/respondents\n */\n async identify(\n userId: string,\n traits?: Record<string, unknown>,\n ): Promise<void> {\n // Store locally first\n this.state.userId = userId;\n if (traits) {\n this.state.userTraits = { ...this.state.userTraits, ...traits };\n }\n\n // Persist session with user info\n this.persistSession();\n\n if (this.debug) {\n console.log(\"[GetForty Tracker] User identified:\", userId, traits);\n }\n\n // Send to backend if online\n if (this.state.isOnline) {\n try {\n const response = await this.api.identify(\n userId,\n traits,\n this.state.sessionId, // Pass sessionId as anonymousId to link events\n );\n\n if (this.debug) {\n if (response.success && response.data) {\n console.log(\"[GetForty Tracker] Identify sent to server:\", {\n trackedUserId: response.data.trackedUserId,\n eventsLinked: response.data.eventsLinked,\n respondentsLinked: response.data.respondentsLinked,\n });\n } else {\n console.warn(\"[GetForty Tracker] Identify failed:\", response.error);\n }\n }\n } catch (error) {\n // Log error but don't throw - identify should not block the app\n if (this.debug) {\n console.error(\"[GetForty Tracker] Error sending identify:\", error);\n }\n }\n } else {\n // Queue for later when back online\n if (this.debug) {\n console.log(\n \"[GetForty Tracker] Offline - identify will be sent when online\",\n );\n }\n // Store pending identify call\n this.pendingIdentify = { userId, traits };\n }\n }\n\n private pendingIdentify: {\n userId: string;\n traits?: Record<string, unknown>;\n } | null = null;\n\n /**\n * Flush all queued events immediately\n */\n async flush(): Promise<void> {\n await this.batcher.flush();\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string {\n return this.state.sessionId;\n }\n\n /**\n * Get current user ID\n */\n getUserId(): string | null {\n return this.state.userId;\n }\n\n /**\n * Get current user traits\n */\n getUserTraits(): Record<string, unknown> {\n return { ...this.state.userTraits };\n }\n\n /**\n * Check if online\n */\n isOnline(): boolean {\n return this.state.isOnline;\n }\n\n /**\n * Destroy the tracker\n */\n destroy(): void {\n this.batcher.destroy();\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"online\", this.handleOnline);\n window.removeEventListener(\"offline\", this.handleOffline);\n }\n }\n\n // Private methods\n\n /**\n * Send events to the API with retry\n */\n private async sendEvents(events: TrackedEvent[]): Promise<void> {\n if (events.length === 0) return;\n\n if (!this.state.isOnline) {\n // Queue events for later\n this.state.eventQueue.push(...events);\n this.persistOfflineQueue();\n return;\n }\n\n try {\n await withRetry(async () => {\n const response = await this.api.trackBatch(events);\n\n if (!response.success) {\n // Check if retryable\n if (response.status && isRetryableError(response.status)) {\n throw new Error(response.error || \"Request failed\");\n }\n\n // Non-retryable error, log and discard\n console.error(\n \"[GetForty Tracker] Non-retryable error:\",\n response.error,\n );\n return;\n }\n\n if (this.debug) {\n console.log(\n \"[GetForty Tracker] Events sent successfully:\",\n response.data,\n );\n }\n }, this.config);\n } catch (error) {\n // All retries failed, queue events for later\n console.error(\n \"[GetForty Tracker] Failed to send events after retries:\",\n error,\n );\n this.state.eventQueue.push(...events);\n this.persistOfflineQueue();\n }\n }\n\n /**\n * Setup online/offline event listeners\n */\n private setupOnlineListeners(): void {\n if (typeof window === \"undefined\") return;\n\n window.addEventListener(\"online\", this.handleOnline);\n window.addEventListener(\"offline\", this.handleOffline);\n\n // Restore offline queue on init\n this.restoreOfflineQueue();\n }\n\n private handleOnline = async (): Promise<void> => {\n this.state.isOnline = true;\n\n if (this.debug) {\n console.log(\"[GetForty Tracker] Online - flushing queued events\");\n }\n\n // Send pending identify if any\n if (this.pendingIdentify) {\n const { userId, traits } = this.pendingIdentify;\n this.pendingIdentify = null;\n await this.identify(userId, traits);\n }\n\n // Flush any queued events\n const queuedEvents = [...this.state.eventQueue];\n this.state.eventQueue = [];\n\n if (queuedEvents.length > 0) {\n this.batcher.addMany(queuedEvents);\n }\n };\n\n private handleOffline = (): void => {\n this.state.isOnline = false;\n\n if (this.debug) {\n console.log(\"[GetForty Tracker] Offline - events will be queued\");\n }\n };\n\n /**\n * Persist session to storage\n */\n private persistSession(): void {\n if (typeof sessionStorage === \"undefined\") return;\n\n try {\n sessionStorage.setItem(\n \"gf_tracker_session\",\n JSON.stringify({\n sessionId: this.state.sessionId,\n userId: this.state.userId,\n userTraits: this.state.userTraits,\n }),\n );\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Persist offline queue to storage\n */\n private persistOfflineQueue(): void {\n if (typeof localStorage === \"undefined\") return;\n\n try {\n localStorage.setItem(\n \"gf_offline_queue\",\n JSON.stringify(this.state.eventQueue),\n );\n } catch {\n // Ignore storage errors\n }\n }\n\n /**\n * Restore offline queue from storage\n */\n private restoreOfflineQueue(): void {\n if (typeof localStorage === \"undefined\") return;\n\n try {\n const stored = localStorage.getItem(\"gf_offline_queue\");\n if (stored) {\n const events = JSON.parse(stored) as TrackedEvent[];\n if (Array.isArray(events) && events.length > 0) {\n if (this.debug) {\n console.log(\n \"[GetForty Tracker] Restoring\",\n events.length,\n \"offline events\",\n );\n }\n\n this.state.eventQueue = events;\n localStorage.removeItem(\"gf_offline_queue\");\n\n // If online, flush immediately\n if (this.state.isOnline) {\n this.handleOnline();\n }\n }\n }\n } catch {\n // Ignore errors\n }\n }\n}\n","/**\n * DataLayer Observer\n * Reads events from parent window's dataLayer (Google Tag Manager)\n * and sends them through GetForty's event tracking pipeline\n */\n\nimport type { Tracker } from \"./tracker\";\n\nexport interface DataLayerObserverConfig {\n /** GetForty tracker instance */\n tracker: Tracker;\n /** Enable debug logging */\n debug?: boolean;\n /** Prefix for event names sent to GetForty (default: \"gtm_\") */\n eventPrefix?: string;\n /** Filter events by name pattern (optional) */\n eventFilter?: RegExp | ((eventName: string) => boolean);\n}\n\n/**\n * DataLayer observer that monitors parent window's dataLayer\n * and forwards events to GetForty tracking\n */\nexport class DataLayerObserver {\n private config: DataLayerObserverConfig;\n private tracker: Tracker;\n private originalPush: ((...items: unknown[]) => number) | null = null;\n private isObserving: boolean = false;\n private processedEvents: Set<string> = new Set();\n private eventPrefix: string;\n\n constructor(config: DataLayerObserverConfig) {\n this.config = config;\n this.tracker = config.tracker;\n this.eventPrefix = config.eventPrefix || \"gtm_\";\n }\n\n /**\n * Start observing the dataLayer\n */\n start(): void {\n if (this.isObserving) {\n if (this.config.debug) {\n console.warn(\"[GetForty DataLayer Observer] Already observing\");\n }\n return;\n }\n\n try {\n // Get reference to parent window's dataLayer\n const dataLayer = this.getDataLayer();\n\n if (!dataLayer) {\n if (this.config.debug) {\n console.warn(\n \"[GetForty DataLayer Observer] dataLayer not found on parent window\",\n );\n }\n return;\n }\n\n // Process existing events in dataLayer\n this.processExistingEvents(dataLayer);\n\n // Intercept push() method to capture new events\n this.interceptPush(dataLayer);\n\n this.isObserving = true;\n\n if (this.config.debug) {\n console.log(\"[GetForty DataLayer Observer] Started observing dataLayer\");\n }\n } catch (error) {\n if (this.config.debug) {\n console.error(\n \"[GetForty DataLayer Observer] Failed to start:\",\n error,\n );\n }\n }\n }\n\n /**\n * Stop observing the dataLayer\n */\n stop(): void {\n if (!this.isObserving) {\n return;\n }\n\n try {\n // Restore original push method\n const dataLayer = this.getDataLayer();\n if (dataLayer && this.originalPush) {\n dataLayer.push = this.originalPush;\n }\n\n this.isObserving = false;\n this.processedEvents.clear();\n\n if (this.config.debug) {\n console.log(\"[GetForty DataLayer Observer] Stopped observing\");\n }\n } catch (error) {\n if (this.config.debug) {\n console.error(\"[GetForty DataLayer Observer] Error stopping:\", error);\n }\n }\n }\n\n /**\n * Get reference to parent window's dataLayer\n * Handles both same-origin and attempts cross-origin\n */\n private getDataLayer(): any[] | null {\n try {\n // Check if we're in an iframe\n const targetWindow = window === window.parent ? window : window.parent;\n\n // Try to access parent's dataLayer\n if ((targetWindow as any).dataLayer) {\n return (targetWindow as any).dataLayer;\n }\n\n if (this.config.debug) {\n console.warn(\n \"[GetForty DataLayer Observer] dataLayer not initialized on parent window\",\n );\n }\n\n return null;\n } catch (error) {\n // Cross-origin access blocked\n if (this.config.debug) {\n console.warn(\n \"[GetForty DataLayer Observer] Cannot access parent dataLayer (cross-origin)\",\n );\n console.info(\n \"[GetForty DataLayer Observer] Cross-origin scenarios not supported for dataLayer observation\",\n );\n }\n return null;\n }\n }\n\n /**\n * Process events already in dataLayer (before we started observing)\n */\n private processExistingEvents(dataLayer: any[]): void {\n if (!Array.isArray(dataLayer)) {\n return;\n }\n\n dataLayer.forEach((item, index) => {\n if (this.isEventObject(item)) {\n // Mark as processed to avoid duplicates\n const eventId = this.getEventId(item, index);\n this.processedEvents.add(eventId);\n\n // Optionally send existing events\n // (commented out by default - usually we only want new events)\n // this.sendEventToGetForty(item);\n }\n });\n\n if (this.config.debug) {\n console.log(\n `[GetForty DataLayer Observer] Processed ${this.processedEvents.size} existing events (not sent)`,\n );\n }\n }\n\n /**\n * Intercept dataLayer.push() to capture new events\n */\n private interceptPush(dataLayer: any[]): void {\n // Store original push\n this.originalPush = dataLayer.push.bind(dataLayer);\n\n const self = this;\n\n // Override push method\n dataLayer.push = function (...args: any[]) {\n // Call original push first\n const result = self.originalPush!.apply(this, args);\n\n // Process pushed events\n args.forEach((item) => {\n if (self.isEventObject(item)) {\n const eventId = self.getEventId(item, dataLayer.length - 1);\n\n // Only process new events (not duplicates)\n if (!self.processedEvents.has(eventId)) {\n self.processedEvents.add(eventId);\n self.sendEventToGetForty(item);\n }\n }\n });\n\n return result;\n };\n }\n\n /**\n * Check if an object is a GTM event (has 'event' property)\n */\n private isEventObject(obj: any): boolean {\n return (\n obj &&\n typeof obj === \"object\" &&\n typeof obj.event === \"string\" &&\n obj.event.length > 0\n );\n }\n\n /**\n * Generate unique ID for an event (to detect duplicates)\n */\n private getEventId(event: any, index: number): string {\n const timestamp = event.timestamp || Date.now();\n return `${event.event}_${timestamp}_${index}`;\n }\n\n /**\n * Check if event passes the filter\n */\n private shouldSendEvent(eventName: string): boolean {\n const filter = this.config.eventFilter;\n\n if (!filter) {\n return true; // No filter, send all\n }\n\n if (filter instanceof RegExp) {\n return filter.test(eventName);\n }\n\n if (typeof filter === \"function\") {\n return filter(eventName);\n }\n\n return true;\n }\n\n /**\n * Send GTM event to GetForty tracking pipeline\n */\n private sendEventToGetForty(gtmEvent: any): void {\n try {\n const eventName = gtmEvent.event;\n\n // Apply filter\n if (!this.shouldSendEvent(eventName)) {\n if (this.config.debug) {\n console.log(\n `[GetForty DataLayer Observer] Event filtered out: ${eventName}`,\n );\n }\n return;\n }\n\n // Extract properties (all fields except 'event')\n const properties: Record<string, unknown> = {};\n for (const key in gtmEvent) {\n if (key !== \"event\" && gtmEvent.hasOwnProperty(key)) {\n properties[key] = gtmEvent[key];\n }\n }\n\n // Add metadata\n properties._source = \"gtm_datalayer\";\n properties._originalEventName = eventName;\n\n // Send through GetForty tracker with prefix\n const getfortyEventName = `${this.eventPrefix}${eventName}`;\n this.tracker.track(getfortyEventName, properties);\n\n if (this.config.debug) {\n console.log(\n `[GetForty DataLayer Observer] Event sent: ${eventName} → ${getfortyEventName}`,\n properties,\n );\n }\n } catch (error) {\n if (this.config.debug) {\n console.error(\n \"[GetForty DataLayer Observer] Error sending event:\",\n error,\n );\n }\n }\n }\n}\n","import { options as _options } from 'preact';\n\n/** @type {number} */\nlet currentIndex;\n\n/** @type {import('./internal').Component} */\nlet currentComponent;\n\n/** @type {import('./internal').Component} */\nlet previousComponent;\n\n/** @type {number} */\nlet currentHook = 0;\n\n/** @type {Array<import('./internal').Component>} */\nlet afterPaintEffects = [];\n\n// Cast to use internal Options type\nconst options = /** @type {import('./internal').Options} */ (_options);\n\nlet oldBeforeDiff = options._diff;\nlet oldBeforeRender = options._render;\nlet oldAfterDiff = options.diffed;\nlet oldCommit = options._commit;\nlet oldBeforeUnmount = options.unmount;\nlet oldRoot = options._root;\n\n// We take the minimum timeout for requestAnimationFrame to ensure that\n// the callback is invoked after the next frame. 35ms is based on a 30hz\n// refresh rate, which is the minimum rate for a smooth user experience.\nconst RAF_TIMEOUT = 35;\nlet prevRaf;\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._diff = vnode => {\n\tcurrentComponent = null;\n\tif (oldBeforeDiff) oldBeforeDiff(vnode);\n};\n\noptions._root = (vnode, parentDom) => {\n\tif (vnode && parentDom._children && parentDom._children._mask) {\n\t\tvnode._mask = parentDom._children._mask;\n\t}\n\n\tif (oldRoot) oldRoot(vnode, parentDom);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions._render = vnode => {\n\tif (oldBeforeRender) oldBeforeRender(vnode);\n\n\tcurrentComponent = vnode._component;\n\tcurrentIndex = 0;\n\n\tconst hooks = currentComponent.__hooks;\n\tif (hooks) {\n\t\tif (previousComponent === currentComponent) {\n\t\t\thooks._pendingEffects = [];\n\t\t\tcurrentComponent._renderCallbacks = [];\n\t\t\thooks._list.forEach(hookItem => {\n\t\t\t\tif (hookItem._nextValue) {\n\t\t\t\t\thookItem._value = hookItem._nextValue;\n\t\t\t\t}\n\t\t\t\thookItem._pendingArgs = hookItem._nextValue = undefined;\n\t\t\t});\n\t\t} else {\n\t\t\thooks._pendingEffects.forEach(invokeCleanup);\n\t\t\thooks._pendingEffects.forEach(invokeEffect);\n\t\t\thooks._pendingEffects = [];\n\t\t\tcurrentIndex = 0;\n\t\t}\n\t}\n\tpreviousComponent = currentComponent;\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.diffed = vnode => {\n\tif (oldAfterDiff) oldAfterDiff(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tif (c.__hooks._pendingEffects.length) afterPaint(afterPaintEffects.push(c));\n\t\tc.__hooks._list.forEach(hookItem => {\n\t\t\tif (hookItem._pendingArgs) {\n\t\t\t\thookItem._args = hookItem._pendingArgs;\n\t\t\t}\n\t\t\thookItem._pendingArgs = undefined;\n\t\t});\n\t}\n\tpreviousComponent = currentComponent = null;\n};\n\n// TODO: Improve typing of commitQueue parameter\n/** @type {(vnode: import('./internal').VNode, commitQueue: any) => void} */\noptions._commit = (vnode, commitQueue) => {\n\tcommitQueue.some(component => {\n\t\ttry {\n\t\t\tcomponent._renderCallbacks.forEach(invokeCleanup);\n\t\t\tcomponent._renderCallbacks = component._renderCallbacks.filter(cb =>\n\t\t\t\tcb._value ? invokeEffect(cb) : true\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tcommitQueue.some(c => {\n\t\t\t\tif (c._renderCallbacks) c._renderCallbacks = [];\n\t\t\t});\n\t\t\tcommitQueue = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t});\n\n\tif (oldCommit) oldCommit(vnode, commitQueue);\n};\n\n/** @type {(vnode: import('./internal').VNode) => void} */\noptions.unmount = vnode => {\n\tif (oldBeforeUnmount) oldBeforeUnmount(vnode);\n\n\tconst c = vnode._component;\n\tif (c && c.__hooks) {\n\t\tlet hasErrored;\n\t\tc.__hooks._list.forEach(s => {\n\t\t\ttry {\n\t\t\t\tinvokeCleanup(s);\n\t\t\t} catch (e) {\n\t\t\t\thasErrored = e;\n\t\t\t}\n\t\t});\n\t\tc.__hooks = undefined;\n\t\tif (hasErrored) options._catchError(hasErrored, c._vnode);\n\t}\n};\n\n/**\n * Get a hook's state from the currentComponent\n * @param {number} index The index of the hook to get\n * @param {number} type The index of the hook to get\n * @returns {any}\n */\nfunction getHookState(index, type) {\n\tif (options._hook) {\n\t\toptions._hook(currentComponent, index, currentHook || type);\n\t}\n\tcurrentHook = 0;\n\n\t// Largely inspired by:\n\t// * https://github.com/michael-klein/funcy.js/blob/f6be73468e6ec46b0ff5aa3cc4c9baf72a29025a/src/hooks/core_hooks.mjs\n\t// * https://github.com/michael-klein/funcy.js/blob/650beaa58c43c33a74820a3c98b3c7079cf2e333/src/renderer.mjs\n\t// Other implementations to look at:\n\t// * https://codesandbox.io/s/mnox05qp8\n\tconst hooks =\n\t\tcurrentComponent.__hooks ||\n\t\t(currentComponent.__hooks = {\n\t\t\t_list: [],\n\t\t\t_pendingEffects: []\n\t\t});\n\n\tif (index >= hooks._list.length) {\n\t\thooks._list.push({});\n\t}\n\n\treturn hooks._list[index];\n}\n\n/**\n * @template {unknown} S\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} [initialState]\n * @returns {[S, (state: S) => void]}\n */\nexport function useState(initialState) {\n\tcurrentHook = 1;\n\treturn useReducer(invokeOrReturn, initialState);\n}\n\n/**\n * @template {unknown} S\n * @template {unknown} A\n * @param {import('./index').Reducer<S, A>} reducer\n * @param {import('./index').Dispatch<import('./index').StateUpdater<S>>} initialState\n * @param {(initialState: any) => void} [init]\n * @returns {[ S, (state: S) => void ]}\n */\nexport function useReducer(reducer, initialState, init) {\n\t/** @type {import('./internal').ReducerHookState} */\n\tconst hookState = getHookState(currentIndex++, 2);\n\thookState._reducer = reducer;\n\tif (!hookState._component) {\n\t\thookState._value = [\n\t\t\t!init ? invokeOrReturn(undefined, initialState) : init(initialState),\n\n\t\t\taction => {\n\t\t\t\tconst currentValue = hookState._nextValue\n\t\t\t\t\t? hookState._nextValue[0]\n\t\t\t\t\t: hookState._value[0];\n\t\t\t\tconst nextValue = hookState._reducer(currentValue, action);\n\n\t\t\t\tif (currentValue !== nextValue) {\n\t\t\t\t\thookState._nextValue = [nextValue, hookState._value[1]];\n\t\t\t\t\thookState._component.setState({});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\thookState._component = currentComponent;\n\n\t\tif (!currentComponent._hasScuFromHooks) {\n\t\t\tcurrentComponent._hasScuFromHooks = true;\n\t\t\tlet prevScu = currentComponent.shouldComponentUpdate;\n\t\t\tconst prevCWU = currentComponent.componentWillUpdate;\n\n\t\t\t// If we're dealing with a forced update `shouldComponentUpdate` will\n\t\t\t// not be called. But we use that to update the hook values, so we\n\t\t\t// need to call it.\n\t\t\tcurrentComponent.componentWillUpdate = function (p, s, c) {\n\t\t\t\tif (this._force) {\n\t\t\t\t\tlet tmp = prevScu;\n\t\t\t\t\t// Clear to avoid other sCU hooks from being called\n\t\t\t\t\tprevScu = undefined;\n\t\t\t\t\tupdateHookState(p, s, c);\n\t\t\t\t\tprevScu = tmp;\n\t\t\t\t}\n\n\t\t\t\tif (prevCWU) prevCWU.call(this, p, s, c);\n\t\t\t};\n\n\t\t\t// This SCU has the purpose of bailing out after repeated updates\n\t\t\t// to stateful hooks.\n\t\t\t// we store the next value in _nextValue[0] and keep doing that for all\n\t\t\t// state setters, if we have next states and\n\t\t\t// all next states within a component end up being equal to their original state\n\t\t\t// we are safe to bail out for this specific component.\n\t\t\t/**\n\t\t\t *\n\t\t\t * @type {import('./internal').Component[\"shouldComponentUpdate\"]}\n\t\t\t */\n\t\t\t// @ts-ignore - We don't use TS to downtranspile\n\t\t\t// eslint-disable-next-line no-inner-declarations\n\t\t\tfunction updateHookState(p, s, c) {\n\t\t\t\tif (!hookState._component.__hooks) return true;\n\n\t\t\t\t/** @type {(x: import('./internal').HookState) => x is import('./internal').ReducerHookState} */\n\t\t\t\tconst isStateHook = x => !!x._component;\n\t\t\t\tconst stateHooks =\n\t\t\t\t\thookState._component.__hooks._list.filter(isStateHook);\n\n\t\t\t\tconst allHooksEmpty = stateHooks.every(x => !x._nextValue);\n\t\t\t\t// When we have no updated hooks in the component we invoke the previous SCU or\n\t\t\t\t// traverse the VDOM tree further.\n\t\t\t\tif (allHooksEmpty) {\n\t\t\t\t\treturn prevScu ? prevScu.call(this, p, s, c) : true;\n\t\t\t\t}\n\n\t\t\t\t// We check whether we have components with a nextValue set that\n\t\t\t\t// have values that aren't equal to one another this pushes\n\t\t\t\t// us to update further down the tree\n\t\t\t\tlet shouldUpdate = hookState._component.props !== p;\n\t\t\t\tstateHooks.forEach(hookItem => {\n\t\t\t\t\tif (hookItem._nextValue) {\n\t\t\t\t\t\tconst currentValue = hookItem._value[0];\n\t\t\t\t\t\thookItem._value = hookItem._nextValue;\n\t\t\t\t\t\thookItem._nextValue = undefined;\n\t\t\t\t\t\tif (currentValue !== hookItem._value[0]) shouldUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn prevScu\n\t\t\t\t\t? prevScu.call(this, p, s, c) || shouldUpdate\n\t\t\t\t\t: shouldUpdate;\n\t\t\t}\n\n\t\t\tcurrentComponent.shouldComponentUpdate = updateHookState;\n\t\t}\n\t}\n\n\treturn hookState._nextValue || hookState._value;\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 3);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent.__hooks._pendingEffects.push(state);\n\t}\n}\n\n/**\n * @param {import('./internal').Effect} callback\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useLayoutEffect(callback, args) {\n\t/** @type {import('./internal').EffectHookState} */\n\tconst state = getHookState(currentIndex++, 4);\n\tif (!options._skipEffects && argsChanged(state._args, args)) {\n\t\tstate._value = callback;\n\t\tstate._pendingArgs = args;\n\n\t\tcurrentComponent._renderCallbacks.push(state);\n\t}\n}\n\n/** @type {(initialValue: unknown) => unknown} */\nexport function useRef(initialValue) {\n\tcurrentHook = 5;\n\treturn useMemo(() => ({ current: initialValue }), []);\n}\n\n/**\n * @param {object} ref\n * @param {() => object} createHandle\n * @param {unknown[]} args\n * @returns {void}\n */\nexport function useImperativeHandle(ref, createHandle, args) {\n\tcurrentHook = 6;\n\tuseLayoutEffect(\n\t\t() => {\n\t\t\tif (typeof ref == 'function') {\n\t\t\t\tconst result = ref(createHandle());\n\t\t\t\treturn () => {\n\t\t\t\t\tref(null);\n\t\t\t\t\tif (result && typeof result == 'function') result();\n\t\t\t\t};\n\t\t\t} else if (ref) {\n\t\t\t\tref.current = createHandle();\n\t\t\t\treturn () => (ref.current = null);\n\t\t\t}\n\t\t},\n\t\targs == null ? args : args.concat(ref)\n\t);\n}\n\n/**\n * @template {unknown} T\n * @param {() => T} factory\n * @param {unknown[]} args\n * @returns {T}\n */\nexport function useMemo(factory, args) {\n\t/** @type {import('./internal').MemoHookState<T>} */\n\tconst state = getHookState(currentIndex++, 7);\n\tif (argsChanged(state._args, args)) {\n\t\tstate._value = factory();\n\t\tstate._args = args;\n\t\tstate._factory = factory;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * @param {() => void} callback\n * @param {unknown[]} args\n * @returns {() => void}\n */\nexport function useCallback(callback, args) {\n\tcurrentHook = 8;\n\treturn useMemo(() => callback, args);\n}\n\n/**\n * @param {import('./internal').PreactContext} context\n */\nexport function useContext(context) {\n\tconst provider = currentComponent.context[context._id];\n\t// We could skip this call here, but than we'd not call\n\t// `options._hook`. We need to do that in order to make\n\t// the devtools aware of this hook.\n\t/** @type {import('./internal').ContextHookState} */\n\tconst state = getHookState(currentIndex++, 9);\n\t// The devtools needs access to the context object to\n\t// be able to pull of the default value when no provider\n\t// is present in the tree.\n\tstate._context = context;\n\tif (!provider) return context._defaultValue;\n\t// This is probably not safe to convert to \"!\"\n\tif (state._value == null) {\n\t\tstate._value = true;\n\t\tprovider.sub(currentComponent);\n\t}\n\treturn provider.props.value;\n}\n\n/**\n * Display a custom label for a custom hook for the devtools panel\n * @type {<T>(value: T, cb?: (value: T) => string | number) => void}\n */\nexport function useDebugValue(value, formatter) {\n\tif (options.useDebugValue) {\n\t\toptions.useDebugValue(\n\t\t\tformatter ? formatter(value) : /** @type {any}*/ (value)\n\t\t);\n\t}\n}\n\n/**\n * @param {(error: unknown, errorInfo: import('preact').ErrorInfo) => void} cb\n * @returns {[unknown, () => void]}\n */\nexport function useErrorBoundary(cb) {\n\t/** @type {import('./internal').ErrorBoundaryHookState} */\n\tconst state = getHookState(currentIndex++, 10);\n\tconst errState = useState();\n\tstate._value = cb;\n\tif (!currentComponent.componentDidCatch) {\n\t\tcurrentComponent.componentDidCatch = (err, errorInfo) => {\n\t\t\tif (state._value) state._value(err, errorInfo);\n\t\t\terrState[1](err);\n\t\t};\n\t}\n\treturn [\n\t\terrState[0],\n\t\t() => {\n\t\t\terrState[1](undefined);\n\t\t}\n\t];\n}\n\n/** @type {() => string} */\nexport function useId() {\n\t/** @type {import('./internal').IdHookState} */\n\tconst state = getHookState(currentIndex++, 11);\n\tif (!state._value) {\n\t\t// Grab either the root node or the nearest async boundary node.\n\t\t/** @type {import('./internal').VNode} */\n\t\tlet root = currentComponent._vnode;\n\t\twhile (root !== null && !root._mask && root._parent !== null) {\n\t\t\troot = root._parent;\n\t\t}\n\n\t\tlet mask = root._mask || (root._mask = [0, 0]);\n\t\tstate._value = 'P' + mask[0] + '-' + mask[1]++;\n\t}\n\n\treturn state._value;\n}\n\n/**\n * After paint effects consumer.\n */\nfunction flushAfterPaintEffects() {\n\tlet component;\n\twhile ((component = afterPaintEffects.shift())) {\n\t\tif (!component._parentDom || !component.__hooks) continue;\n\t\ttry {\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeCleanup);\n\t\t\tcomponent.__hooks._pendingEffects.forEach(invokeEffect);\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t} catch (e) {\n\t\t\tcomponent.__hooks._pendingEffects = [];\n\t\t\toptions._catchError(e, component._vnode);\n\t\t}\n\t}\n}\n\nlet HAS_RAF = typeof requestAnimationFrame == 'function';\n\n/**\n * Schedule a callback to be invoked after the browser has a chance to paint a new frame.\n * Do this by combining requestAnimationFrame (rAF) + setTimeout to invoke a callback after\n * the next browser frame.\n *\n * Also, schedule a timeout in parallel to the the rAF to ensure the callback is invoked\n * even if RAF doesn't fire (for example if the browser tab is not visible)\n *\n * @param {() => void} callback\n */\nfunction afterNextFrame(callback) {\n\tconst done = () => {\n\t\tclearTimeout(timeout);\n\t\tif (HAS_RAF) cancelAnimationFrame(raf);\n\t\tsetTimeout(callback);\n\t};\n\tconst timeout = setTimeout(done, RAF_TIMEOUT);\n\n\tlet raf;\n\tif (HAS_RAF) {\n\t\traf = requestAnimationFrame(done);\n\t}\n}\n\n// Note: if someone used options.debounceRendering = requestAnimationFrame,\n// then effects will ALWAYS run on the NEXT frame instead of the current one, incurring a ~16ms delay.\n// Perhaps this is not such a big deal.\n/**\n * Schedule afterPaintEffects flush after the browser paints\n * @param {number} newQueueLength\n * @returns {void}\n */\nfunction afterPaint(newQueueLength) {\n\tif (newQueueLength === 1 || prevRaf !== options.requestAnimationFrame) {\n\t\tprevRaf = options.requestAnimationFrame;\n\t\t(prevRaf || afterNextFrame)(flushAfterPaintEffects);\n\t}\n}\n\n/**\n * @param {import('./internal').HookState} hook\n * @returns {void}\n */\nfunction invokeCleanup(hook) {\n\t// A hook cleanup can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\tlet cleanup = hook._cleanup;\n\tif (typeof cleanup == 'function') {\n\t\thook._cleanup = undefined;\n\t\tcleanup();\n\t}\n\n\tcurrentComponent = comp;\n}\n\n/**\n * Invoke a Hook's effect\n * @param {import('./internal').EffectHookState} hook\n * @returns {void}\n */\nfunction invokeEffect(hook) {\n\t// A hook call can introduce a call to render which creates a new root, this will call options.vnode\n\t// and move the currentComponent away.\n\tconst comp = currentComponent;\n\thook._cleanup = hook._value();\n\tcurrentComponent = comp;\n}\n\n/**\n * @param {unknown[]} oldArgs\n * @param {unknown[]} newArgs\n * @returns {boolean}\n */\nfunction argsChanged(oldArgs, newArgs) {\n\treturn (\n\t\t!oldArgs ||\n\t\toldArgs.length !== newArgs.length ||\n\t\tnewArgs.some((arg, index) => arg !== oldArgs[index])\n\t);\n}\n\n/**\n * @template Arg\n * @param {Arg} arg\n * @param {(arg: Arg) => any} f\n * @returns {any}\n */\nfunction invokeOrReturn(arg, f) {\n\treturn typeof f == 'function' ? f(arg) : f;\n}\n","const ENCODED_ENTITIES = /[\"&<]/;\n\n/** @param {string} str */\nexport function encodeEntities(str) {\n\t// Skip all work for strings with no entities needing encoding:\n\tif (str.length === 0 || ENCODED_ENTITIES.test(str) === false) return str;\n\n\tlet last = 0,\n\t\ti = 0,\n\t\tout = '',\n\t\tch = '';\n\n\t// Seek forward in str until the next entity char:\n\tfor (; i < str.length; i++) {\n\t\tswitch (str.charCodeAt(i)) {\n\t\t\tcase 34:\n\t\t\t\tch = '"';\n\t\t\t\tbreak;\n\t\t\tcase 38:\n\t\t\t\tch = '&';\n\t\t\t\tbreak;\n\t\t\tcase 60:\n\t\t\t\tch = '<';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\t\t// Append skipped/buffered characters and the encoded entity:\n\t\tif (i !== last) out += str.slice(last, i);\n\t\tout += ch;\n\t\t// Start the next seek/buffer after the entity's offset:\n\t\tlast = i + 1;\n\t}\n\tif (i !== last) out += str.slice(last, i);\n\treturn out;\n}\n","/** Normal hydration that attaches to a DOM tree but does not diff it. */\nexport const MODE_HYDRATE = 1 << 5;\n/** Signifies this VNode suspended on the previous render */\nexport const MODE_SUSPENDED = 1 << 7;\n/** Indicates that this node needs to be inserted while patching children */\nexport const INSERT_VNODE = 1 << 2;\n/** Indicates a VNode has been matched with another VNode in the diff */\nexport const MATCHED = 1 << 1;\n\n/** Reset all mode flags */\nexport const RESET_MODE = ~(MODE_HYDRATE | MODE_SUSPENDED);\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\nexport const XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\nexport const MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n\nexport const NULL = null;\nexport const UNDEFINED = undefined;\nexport const EMPTY_OBJ = /** @type {any} */ ({});\nexport const EMPTY_ARR = [];\nexport const IS_NON_DIMENSIONAL =\n\t/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;\n","import { options, Fragment } from 'preact';\nimport { encodeEntities } from './utils';\nimport { IS_NON_DIMENSIONAL } from '../../src/constants';\n\nlet vnodeId = 0;\n\nconst isArray = Array.isArray;\n\n/**\n * @fileoverview\n * This file exports various methods that implement Babel's \"automatic\" JSX runtime API:\n * - jsx(type, props, key)\n * - jsxs(type, props, key)\n * - jsxDEV(type, props, key, __source, __self)\n *\n * The implementation of createVNode here is optimized for performance.\n * Benchmarks: https://esbench.com/bench/5f6b54a0b4632100a7dcd2b3\n */\n\n/**\n * JSX.Element factory used by Babel's {runtime:\"automatic\"} JSX transform\n * @param {VNode['type']} type\n * @param {VNode['props']} props\n * @param {VNode['key']} [key]\n * @param {unknown} [isStaticChildren]\n * @param {unknown} [__source]\n * @param {unknown} [__self]\n */\nfunction createVNode(type, props, key, isStaticChildren, __source, __self) {\n\tif (!props) props = {};\n\t// We'll want to preserve `ref` in props to get rid of the need for\n\t// forwardRef components in the future, but that should happen via\n\t// a separate PR.\n\tlet normalizedProps = props,\n\t\tref,\n\t\ti;\n\n\tif ('ref' in normalizedProps) {\n\t\tnormalizedProps = {};\n\t\tfor (i in props) {\n\t\t\tif (i == 'ref') {\n\t\t\t\tref = props[i];\n\t\t\t} else {\n\t\t\t\tnormalizedProps[i] = props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @type {VNode & { __source: any; __self: any }} */\n\tconst vnode = {\n\t\ttype,\n\t\tprops: normalizedProps,\n\t\tkey,\n\t\tref,\n\t\t_children: null,\n\t\t_parent: null,\n\t\t_depth: 0,\n\t\t_dom: null,\n\t\t_component: null,\n\t\tconstructor: undefined,\n\t\t_original: --vnodeId,\n\t\t_index: -1,\n\t\t_flags: 0,\n\t\t__source,\n\t\t__self\n\t};\n\n\t// If a Component VNode, check for and apply defaultProps.\n\t// Note: `type` is often a String, and can be `undefined` in development.\n\tif (typeof type === 'function' && (ref = type.defaultProps)) {\n\t\tfor (i in ref)\n\t\t\tif (normalizedProps[i] === undefined) {\n\t\t\t\tnormalizedProps[i] = ref[i];\n\t\t\t}\n\t}\n\n\tif (options.vnode) options.vnode(vnode);\n\treturn vnode;\n}\n\n/**\n * Create a template vnode. This function is not expected to be\n * used directly, but rather through a precompile JSX transform\n * @param {string[]} templates\n * @param {Array<string | null | VNode>} exprs\n * @returns {VNode}\n */\nfunction jsxTemplate(templates, ...exprs) {\n\tconst vnode = createVNode(Fragment, { tpl: templates, exprs });\n\t// Bypass render to string top level Fragment optimization\n\tvnode.key = vnode._vnode;\n\treturn vnode;\n}\n\nconst JS_TO_CSS = {};\nconst CSS_REGEX = /[A-Z]/g;\n\n/**\n * Unwrap potential signals.\n * @param {*} value\n * @returns {*}\n */\nfunction normalizeAttrValue(value) {\n\treturn value !== null &&\n\t\ttypeof value === 'object' &&\n\t\ttypeof value.valueOf === 'function'\n\t\t? value.valueOf()\n\t\t: value;\n}\n\n/**\n * Serialize an HTML attribute to a string. This function is not\n * expected to be used directly, but rather through a precompile\n * JSX transform\n * @param {string} name The attribute name\n * @param {*} value The attribute value\n * @returns {string}\n */\nfunction jsxAttr(name, value) {\n\tif (options.attr) {\n\t\tconst result = options.attr(name, value);\n\t\tif (typeof result === 'string') return result;\n\t}\n\n\tvalue = normalizeAttrValue(value);\n\n\tif (name === 'ref' || name === 'key') return '';\n\tif (name === 'style' && typeof value === 'object') {\n\t\tlet str = '';\n\t\tfor (let prop in value) {\n\t\t\tlet val = value[prop];\n\t\t\tif (val != null && val !== '') {\n\t\t\t\tconst name =\n\t\t\t\t\tprop[0] == '-'\n\t\t\t\t\t\t? prop\n\t\t\t\t\t\t: JS_TO_CSS[prop] ||\n\t\t\t\t\t\t\t(JS_TO_CSS[prop] = prop.replace(CSS_REGEX, '-$&').toLowerCase());\n\n\t\t\t\tlet suffix = ';';\n\t\t\t\tif (\n\t\t\t\t\ttypeof val === 'number' &&\n\t\t\t\t\t// Exclude custom-attributes\n\t\t\t\t\t!name.startsWith('--') &&\n\t\t\t\t\t!IS_NON_DIMENSIONAL.test(name)\n\t\t\t\t) {\n\t\t\t\t\tsuffix = 'px;';\n\t\t\t\t}\n\t\t\t\tstr = str + name + ':' + val + suffix;\n\t\t\t}\n\t\t}\n\t\treturn name + '=\"' + encodeEntities(str) + '\"';\n\t}\n\n\tif (\n\t\tvalue == null ||\n\t\tvalue === false ||\n\t\ttypeof value === 'function' ||\n\t\ttypeof value === 'object'\n\t) {\n\t\treturn '';\n\t} else if (value === true) return name;\n\n\treturn name + '=\"' + encodeEntities('' + value) + '\"';\n}\n\n/**\n * Escape a dynamic child passed to `jsxTemplate`. This function\n * is not expected to be used directly, but rather through a\n * precompile JSX transform\n * @param {*} value\n * @returns {string | null | VNode | Array<string | null | VNode>}\n */\nfunction jsxEscape(value) {\n\tif (\n\t\tvalue == null ||\n\t\ttypeof value === 'boolean' ||\n\t\ttypeof value === 'function'\n\t) {\n\t\treturn null;\n\t}\n\n\tif (typeof value === 'object') {\n\t\t// Check for VNode\n\t\tif (value.constructor === undefined) return value;\n\n\t\tif (isArray(value)) {\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tvalue[i] = jsxEscape(value[i]);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t}\n\n\treturn encodeEntities('' + value);\n}\n\nexport {\n\tcreateVNode as jsx,\n\tcreateVNode as jsxs,\n\tcreateVNode as jsxDEV,\n\tFragment,\n\t// precompiled JSX transform\n\tjsxTemplate,\n\tjsxAttr,\n\tjsxEscape\n};\n","/**\n * Button Component\n * Reusable button for form actions\n */\n\nimport type { JSX } from \"preact\";\n\nexport interface ButtonProps {\n children: JSX.Element | string;\n onClick?: () => void;\n type?: \"button\" | \"submit\";\n variant?: \"primary\" | \"secondary\";\n disabled?: boolean;\n loading?: boolean;\n className?: string;\n}\n\nexport function Button({\n children,\n onClick,\n type = \"button\",\n variant = \"primary\",\n disabled = false,\n loading = false,\n className = \"\",\n}: ButtonProps): JSX.Element {\n const baseClass = \"gf-button\";\n const variantClass =\n variant === \"primary\" ? \"gf-button-primary\" : \"gf-button-secondary\";\n const loadingClass = loading ? \"gf-button-loading\" : \"\";\n\n return (\n <button\n type={type}\n onClick={onClick}\n disabled={disabled || loading}\n className={`${baseClass} ${variantClass} ${loadingClass} ${className}`.trim()}\n aria-busy={loading}\n >\n {loading ? \"\" : children}\n </button>\n );\n}\n","/**\n * Question Component\n * Renders different question types (text, rating, NPS, select, etc.)\n */\n\nimport type { JSX } from \"preact\";\nimport type { Question as QuestionType } from \"../types\";\n\nexport interface QuestionProps {\n question: QuestionType;\n value: string | string[] | number | undefined;\n onChange: (value: string | string[] | number) => void;\n error?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n npsNotLikely?: string;\n npsVeryLikely?: string;\n}\n\nexport function Question({\n question,\n value,\n onChange,\n error,\n onFocus,\n onBlur,\n npsNotLikely = \"Not likely\",\n npsVeryLikely = \"Very likely\",\n}: QuestionProps): JSX.Element {\n const hasError = Boolean(error);\n\n return (\n <div\n className=\"gf-question\"\n role=\"group\"\n aria-labelledby={`label-${question.id}`}\n aria-describedby={\n question.description ? `desc-${question.id}` : undefined\n }\n >\n <label id={`label-${question.id}`} className=\"gf-question-label\">\n {question.label}\n {question.required && (\n <span className=\"gf-required\" aria-hidden=\"true\">\n *\n </span>\n )}\n {question.required && <span className=\"gf-sr-only\"> (required)</span>}\n </label>\n\n {question.description && (\n <p id={`desc-${question.id}`} className=\"gf-question-description\">\n {question.description}\n </p>\n )}\n\n {renderInput(question, value, onChange, hasError, onFocus, onBlur, npsNotLikely, npsVeryLikely)}\n\n {error && (\n <p className=\"gf-error-message\" role=\"alert\" aria-live=\"polite\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\nfunction renderInput(\n question: QuestionType,\n value: string | string[] | number | undefined,\n onChange: (value: string | string[] | number) => void,\n hasError: boolean,\n onFocus?: () => void,\n onBlur?: () => void,\n npsNotLikely?: string,\n npsVeryLikely?: string,\n): JSX.Element {\n switch (question.type) {\n case \"nps\":\n return (\n <NPSInput\n question={question}\n value={value as number}\n onChange={onChange}\n onFocus={onFocus}\n notLikelyLabel={npsNotLikely || \"Not likely\"}\n veryLikelyLabel={npsVeryLikely || \"Very likely\"}\n />\n );\n case \"rating\":\n case \"scale\":\n return (\n <RatingInput\n question={question}\n value={value as number}\n onChange={onChange}\n onFocus={onFocus}\n />\n );\n case \"textarea\":\n return (\n <TextareaInput\n question={question}\n value={value as string}\n onChange={onChange}\n hasError={hasError}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n );\n case \"select\":\n return (\n <SelectInput\n question={question}\n value={value as string}\n onChange={onChange}\n onFocus={onFocus}\n />\n );\n case \"multiselect\":\n return (\n <MultiselectInput\n question={question}\n value={value as string[]}\n onChange={onChange}\n onFocus={onFocus}\n />\n );\n case \"text\":\n default:\n return (\n <TextInput\n question={question}\n value={value as string}\n onChange={onChange}\n hasError={hasError}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n );\n }\n}\n\n// NPS (0-10 scale)\nfunction NPSInput({\n question,\n value,\n onChange,\n onFocus,\n notLikelyLabel,\n veryLikelyLabel,\n}: {\n question: QuestionType;\n value: number | undefined;\n onChange: (value: number) => void;\n onFocus?: () => void;\n notLikelyLabel: string;\n veryLikelyLabel: string;\n}): JSX.Element {\n return (\n <div\n className=\"gf-rating-container\"\n role=\"radiogroup\"\n aria-label={question.label}\n >\n {Array.from({ length: 11 }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n className={`gf-rating-option ${value === i ? \"selected\" : \"\"}`}\n onClick={() => onChange(i)}\n onFocus={() => onFocus?.()}\n role=\"radio\"\n aria-checked={value === i}\n aria-label={`${i}`}\n >\n {i}\n </button>\n ))}\n <div className=\"gf-rating-labels\">\n <span>{notLikelyLabel}</span>\n <span>{veryLikelyLabel}</span>\n </div>\n </div>\n );\n}\n\n// Rating scale (1-5 or configurable)\nfunction RatingInput({\n question,\n value,\n onChange,\n onFocus,\n}: {\n question: QuestionType;\n value: number | undefined;\n onChange: (value: number) => void;\n onFocus?: () => void;\n}): JSX.Element {\n const max = 5; // Default rating scale\n\n return (\n <div\n className=\"gf-rating-container\"\n role=\"radiogroup\"\n aria-label={question.label}\n >\n {Array.from({ length: max }, (_, i) => (\n <button\n key={i + 1}\n type=\"button\"\n className={`gf-rating-option ${value === i + 1 ? \"selected\" : \"\"}`}\n onClick={() => onChange(i + 1)}\n onFocus={() => onFocus?.()}\n role=\"radio\"\n aria-checked={value === i + 1}\n aria-label={`${i + 1}`}\n >\n {i + 1}\n </button>\n ))}\n </div>\n );\n}\n\n// Text input\nfunction TextInput({\n question,\n value,\n onChange,\n hasError,\n onFocus,\n onBlur,\n}: {\n question: QuestionType;\n value: string | undefined;\n onChange: (value: string) => void;\n hasError: boolean;\n onFocus?: () => void;\n onBlur?: () => void;\n}): JSX.Element {\n return (\n <input\n type=\"text\"\n id={question.id}\n className={`gf-input ${hasError ? \"gf-input-error\" : \"\"}`}\n value={value || \"\"}\n onInput={(e) => onChange((e.target as HTMLInputElement).value)}\n onFocus={() => onFocus?.()}\n onBlur={() => onBlur?.()}\n required={question.required}\n minLength={question.validation?.minLength}\n maxLength={question.validation?.maxLength}\n aria-invalid={hasError}\n />\n );\n}\n\n// Textarea input\nfunction TextareaInput({\n question,\n value,\n onChange,\n hasError,\n onFocus,\n onBlur,\n}: {\n question: QuestionType;\n value: string | undefined;\n onChange: (value: string) => void;\n hasError: boolean;\n onFocus?: () => void;\n onBlur?: () => void;\n}): JSX.Element {\n return (\n <textarea\n id={question.id}\n className={`gf-textarea ${hasError ? \"gf-input-error\" : \"\"}`}\n value={value || \"\"}\n onInput={(e) => onChange((e.target as HTMLTextAreaElement).value)}\n onFocus={() => onFocus?.()}\n onBlur={() => onBlur?.()}\n required={question.required}\n minLength={question.validation?.minLength}\n maxLength={question.validation?.maxLength}\n aria-invalid={hasError}\n />\n );\n}\n\n// Single select\nfunction SelectInput({\n question,\n value,\n onChange,\n onFocus,\n}: {\n question: QuestionType;\n value: string | undefined;\n onChange: (value: string) => void;\n onFocus?: () => void;\n}): JSX.Element {\n const options = question.options || [];\n\n return (\n <div\n className=\"gf-select-options\"\n role=\"radiogroup\"\n aria-label={question.label}\n >\n {options.map((option) => (\n <label\n key={option.value}\n className={`gf-select-option ${\n value === option.value ? \"selected\" : \"\"\n }`}\n >\n <input\n type=\"radio\"\n name={question.id}\n value={option.value}\n checked={value === option.value}\n onChange={() => onChange(option.value)}\n onFocus={() => onFocus?.()}\n aria-checked={value === option.value}\n />\n <span className=\"gf-radio\" aria-hidden=\"true\"></span>\n {option.label}\n </label>\n ))}\n </div>\n );\n}\n\n// Multi select\nfunction MultiselectInput({\n question,\n value,\n onChange,\n onFocus,\n}: {\n question: QuestionType;\n value: string[] | undefined;\n onChange: (value: string[]) => void;\n onFocus?: () => void;\n}): JSX.Element {\n const options = question.options || [];\n const selected = value || [];\n\n const handleToggle = (optionValue: string): void => {\n if (selected.includes(optionValue)) {\n onChange(selected.filter((v) => v !== optionValue));\n } else {\n onChange([...selected, optionValue]);\n }\n };\n\n return (\n <div className=\"gf-select-options\" role=\"group\" aria-label={question.label}>\n {options.map((option) => (\n <label\n key={option.value}\n className={`gf-select-option ${\n selected.includes(option.value) ? \"selected\" : \"\"\n }`}\n >\n <input\n type=\"checkbox\"\n name={question.id}\n value={option.value}\n checked={selected.includes(option.value)}\n onChange={() => handleToggle(option.value)}\n onFocus={() => onFocus?.()}\n />\n <span className=\"gf-checkbox\" aria-hidden=\"true\"></span>\n {option.label}\n </label>\n ))}\n </div>\n );\n}\n","/**\n * Forms API Client\n * Handles fetching form configuration and submitting responses\n */\n\nimport { ApiClient, type ApiResponse } from \"./client\";\nimport type { FormConfig, Answer } from \"../types\";\n\ninterface GetPublicFormResponse {\n id: string;\n title: string;\n type: string;\n questionsConfig: unknown[];\n brandingConfig?: {\n logoUrl?: string;\n thankYouMessage?: string;\n colors?: {\n primary?: string;\n background?: string;\n };\n };\n}\n\ninterface SubmitResponseInput {\n formId: string;\n answers: { [key: string]: string | number | string[] };\n trackingId?: string;\n anonymousId?: string;\n externalUserId?: string;\n source: \"EMBED\";\n metadata?: {\n hostDomain?: string;\n widgetVersion?: string;\n locale?: string;\n sessionId?: string;\n userId?: string;\n };\n}\n\ninterface SubmitResponseOutput {\n responseId: string;\n anonymousId: string;\n}\n\nexport interface FormsApiConfig {\n baseUrl?: string;\n trackingId?: string;\n debug?: boolean;\n}\n\n/**\n * Forms API client for fetching forms and submitting responses\n */\nexport class FormsApi {\n private client: ApiClient;\n private trackingId?: string;\n\n constructor(config: FormsApiConfig = {}) {\n this.trackingId = config.trackingId;\n this.client = new ApiClient({\n baseUrl: config.baseUrl,\n debug: config.debug,\n });\n }\n\n /**\n * Fetch public form configuration\n */\n async getPublicForm(formId: string): Promise<ApiResponse<FormConfig>> {\n // Use the public API endpoint (GET /api/v1/forms/:formId)\n const response = await this.client.get<GetPublicFormResponse>(\n `/api/v1/forms/${encodeURIComponent(formId)}`,\n );\n\n if (!response.success || !response.data) {\n return {\n success: false,\n error: response.error || \"Form not found\",\n status: response.status,\n };\n }\n\n // Transform API response to FormConfig\n const data = response.data;\n const formConfig: FormConfig = {\n id: data.id,\n title: data.title,\n type: data.type as \"NPS\" | \"CSAT\" | \"PMF\" | \"CUSTOM\",\n questions: this.transformQuestions(data.questionsConfig),\n branding: data.brandingConfig,\n };\n\n return {\n success: true,\n data: formConfig,\n status: response.status,\n };\n }\n\n /**\n * Submit form response\n */\n async submitResponse(\n formId: string,\n answers: Answer[],\n metadata: SubmitResponseInput[\"metadata\"],\n ): Promise<ApiResponse<SubmitResponseOutput>> {\n // Transform answers array to object format\n const answersObj: { [key: string]: string | number | string[] } = {};\n for (const answer of answers) {\n answersObj[answer.questionId] = answer.value;\n }\n\n // Use the public API endpoint with trackingId for auth\n return this.client.post<SubmitResponseInput, SubmitResponseOutput>(\n \"/api/v1/responses\",\n {\n formId,\n answers: answersObj,\n trackingId: this.trackingId,\n source: \"EMBED\",\n metadata,\n },\n );\n }\n\n /**\n * Transform API questions to FormConfig format\n */\n private transformQuestions(\n questionsConfig: unknown[],\n ): FormConfig[\"questions\"] {\n if (!Array.isArray(questionsConfig)) return [];\n\n return questionsConfig.map((q: unknown) => {\n const question = q as Record<string, unknown>;\n return {\n id: String(question.id || \"\"),\n type: this.mapQuestionType(String(question.type || \"text\")),\n label: String(question.label || question.text || \"\"),\n description: question.description\n ? String(question.description)\n : undefined,\n required: Boolean(question.required),\n options: this.transformOptions(question.options),\n validation:\n question.validation as FormConfig[\"questions\"][0][\"validation\"],\n };\n });\n }\n\n /**\n * Map API question type to widget question type\n */\n private mapQuestionType(type: string): FormConfig[\"questions\"][0][\"type\"] {\n const typeMap: Record<string, FormConfig[\"questions\"][0][\"type\"]> = {\n rating: \"rating\",\n nps: \"nps\",\n text: \"text\",\n textarea: \"textarea\",\n select: \"select\",\n multiselect: \"multiselect\",\n scale: \"scale\",\n number: \"rating\",\n \"short-text\": \"text\",\n \"long-text\": \"textarea\",\n // Map GetForty template types\n singleChoice: \"select\",\n multipleChoice: \"multiselect\",\n };\n return typeMap[type] || \"text\";\n }\n\n /**\n * Transform options to widget format\n * Handles both string arrays and object arrays\n */\n private transformOptions(\n options: unknown,\n ): FormConfig[\"questions\"][0][\"options\"] {\n if (!Array.isArray(options)) return undefined;\n\n return options.map((opt: unknown) => {\n // Handle plain string options (e.g., ['Very disappointed', 'Somewhat disappointed'])\n if (typeof opt === \"string\") {\n return {\n value: opt,\n label: opt,\n };\n }\n\n // Handle object options (e.g., { value: 'a', label: 'Option A' })\n const option = opt as Record<string, unknown>;\n return {\n value: String(option.value || option.id || \"\"),\n label: String(option.label || option.text || option.value || \"\"),\n };\n });\n }\n}\n","/**\n * English translations for GetForty Widget\n */\n\nimport type { TranslationStrings } from \"../types\";\n\nexport const en: TranslationStrings = {\n // Form UI\n submit: \"Submit\",\n submitting: \"Submitting...\",\n next: \"Next\",\n previous: \"Previous\",\n skip: \"Skip\",\n\n // Validation\n required: \"This field is required\",\n invalidEmail: \"Please enter a valid email address\",\n invalidNumber: \"Please enter a valid number\",\n minLength: \"Must be at least {min} characters\",\n maxLength: \"Must be at most {max} characters\",\n\n // States\n loading: \"Loading...\",\n success: \"Thank you!\",\n successMessage: \"Your feedback has been submitted successfully.\",\n error: \"Something went wrong\",\n networkError: \"Network error. Please check your connection.\",\n rateLimited: \"Please wait before submitting again\",\n tryAgain: \"Try Again\",\n\n // NPS labels\n npsNotLikely: \"Not likely\",\n npsVeryLikely: \"Very likely\",\n\n // Accessibility\n closeModal: \"Close\",\n formLabel: \"Feedback form\",\n questionOf: \"Question {current} of {total}\",\n};\n","/**\n * Portuguese (Brazil) translations for GetForty Widget\n */\n\nimport type { TranslationStrings } from \"../types\";\n\nexport const ptBR: TranslationStrings = {\n // Form UI\n submit: \"Enviar\",\n submitting: \"Enviando...\",\n next: \"Próximo\",\n previous: \"Anterior\",\n skip: \"Pular\",\n\n // Validation\n required: \"Este campo é obrigatório\",\n invalidEmail: \"Por favor, insira um email válido\",\n invalidNumber: \"Por favor, insira um número válido\",\n minLength: \"Deve ter pelo menos {min} caracteres\",\n maxLength: \"Deve ter no máximo {max} caracteres\",\n\n // States\n loading: \"Carregando...\",\n success: \"Obrigado!\",\n successMessage: \"Seu feedback foi enviado com sucesso.\",\n error: \"Algo deu errado\",\n networkError: \"Erro de conexão. Verifique sua internet.\",\n rateLimited: \"Por favor, aguarde antes de enviar novamente\",\n tryAgain: \"Tentar novamente\",\n\n // NPS labels\n npsNotLikely: \"Pouco provável\",\n npsVeryLikely: \"Muito provável\",\n\n // Accessibility\n closeModal: \"Fechar\",\n formLabel: \"Formulário de feedback\",\n questionOf: \"Pergunta {current} de {total}\",\n};\n","/**\n * Internationalization (i18n) for GetForty Widget\n * Provides translations and locale detection\n */\n\nimport type { TranslationStrings } from \"../types\";\nimport { en } from \"./en\";\nimport { ptBR } from \"./pt-BR\";\n\n/**\n * Built-in translations\n */\nconst translations: Record<string, TranslationStrings> = {\n en,\n \"pt-BR\": ptBR,\n // Fallback aliases\n pt: ptBR,\n \"pt-br\": ptBR,\n};\n\n/**\n * Default locale\n */\nconst DEFAULT_LOCALE = \"en\";\n\n/**\n * Detect browser locale\n */\nfunction detectBrowserLocale(): string {\n if (typeof navigator === \"undefined\") return DEFAULT_LOCALE;\n\n // Get browser language preference\n const browserLang =\n navigator.language || (navigator as { userLanguage?: string }).userLanguage;\n\n if (!browserLang) return DEFAULT_LOCALE;\n\n // Check for exact match first\n if (translations[browserLang]) {\n return browserLang;\n }\n\n // Check for language-only match (e.g., \"pt\" from \"pt-PT\")\n const languageOnly = browserLang.split(\"-\")[0];\n if (translations[languageOnly]) {\n return languageOnly;\n }\n\n return DEFAULT_LOCALE;\n}\n\n/**\n * Resolve the locale to use based on config and browser\n */\nexport function resolveLocale(configLocale?: string): string {\n // Priority: config > browser > default\n if (configLocale) {\n // Check if we have this translation\n if (translations[configLocale]) {\n return configLocale;\n }\n // Try language-only fallback\n const languageOnly = configLocale.split(\"-\")[0];\n if (translations[languageOnly]) {\n return languageOnly;\n }\n }\n\n return detectBrowserLocale();\n}\n\n/**\n * Get translations for a locale, merged with custom translations\n */\nexport function getTranslations(\n locale: string,\n customTranslations?: Partial<TranslationStrings>,\n): TranslationStrings {\n // Get base translations (fallback to English)\n const base = translations[locale] || translations[DEFAULT_LOCALE];\n\n // Merge with custom translations if provided\n if (customTranslations) {\n return { ...base, ...customTranslations };\n }\n\n return base;\n}\n\n/**\n * Translation function factory\n * Returns a function that looks up translation keys\n */\nexport function createTranslator(\n locale: string,\n customTranslations?: Partial<TranslationStrings>,\n): (\n key: keyof TranslationStrings,\n replacements?: Record<string, string | number>,\n) => string {\n const strings = getTranslations(locale, customTranslations);\n\n return (\n key: keyof TranslationStrings,\n replacements?: Record<string, string | number>,\n ): string => {\n let value = strings[key] || key;\n\n // Replace placeholders like {min}, {max}, {current}, {total}\n if (replacements) {\n for (const [placeholder, replacement] of Object.entries(replacements)) {\n value = value.replace(\n new RegExp(`\\\\{${placeholder}\\\\}`, \"g\"),\n String(replacement),\n );\n }\n }\n\n return value;\n };\n}\n\n/**\n * Available locales\n */\nexport const availableLocales = Object.keys(translations);\n\n/**\n * Check if a locale is supported\n */\nexport function isLocaleSupported(locale: string): boolean {\n return locale in translations;\n}\n","/**\n * Widget constants\n */\n\nexport const VERSION = \"0.1.0\";\n","/**\n * Form Component\n * Main feedback form with state management and submission handling\n */\n\nimport { useState, useEffect, useMemo } from \"preact/hooks\";\nimport type { JSX } from \"preact\";\nimport { Button } from \"./Button\";\nimport { Question } from \"./Question\";\nimport { FormsApi } from \"../api/forms\";\nimport { canSubmitForm, recordSubmission } from \"../utils/throttle\";\nimport { createTranslator, resolveLocale } from \"../i18n\";\nimport type {\n FormConfig,\n Answer,\n WidgetTheme,\n WidgetEventMap,\n TranslationStrings,\n} from \"../types\";\nimport { VERSION } from \"../constants\";\n\nexport interface FormProps {\n formId: string;\n apiBaseUrl?: string;\n trackingId?: string;\n theme?: WidgetTheme;\n showBranding?: boolean;\n locale?: string;\n translations?: Partial<TranslationStrings>;\n sessionId?: string;\n userId?: string;\n debug?: boolean;\n onEvent: <K extends keyof WidgetEventMap>(\n event: K,\n data: WidgetEventMap[K],\n ) => void;\n onClose: () => void;\n}\n\ntype FormState =\n | { status: \"loading\" }\n | { status: \"ready\"; form: FormConfig }\n | { status: \"submitting\"; form: FormConfig }\n | { status: \"success\"; responseId: string }\n | { status: \"error\"; message: string; retryable: boolean; form?: FormConfig };\n\nconst STORAGE_KEY_PREFIX = \"gf_form_answers_\";\n\nexport function Form({\n formId,\n apiBaseUrl,\n trackingId,\n theme,\n showBranding = true,\n locale = \"en\",\n translations: customTranslations,\n sessionId,\n userId,\n debug = false,\n onEvent,\n onClose,\n}: FormProps): JSX.Element {\n const [state, setState] = useState<FormState>({ status: \"loading\" });\n const [answers, setAnswers] = useState<\n Record<string, string | string[] | number>\n >({});\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n // Create translator with resolved locale and custom translations\n const resolvedLocale = useMemo(() => resolveLocale(locale), [locale]);\n const t = useMemo(\n () => createTranslator(resolvedLocale, customTranslations),\n [resolvedLocale, customTranslations],\n );\n\n const api = new FormsApi({ baseUrl: apiBaseUrl, trackingId, debug });\n const storageKey = `${STORAGE_KEY_PREFIX}${formId}`;\n\n // Load form configuration\n useEffect(() => {\n loadForm();\n }, [formId]);\n\n // Restore saved answers\n useEffect(() => {\n if (typeof sessionStorage !== \"undefined\") {\n try {\n const saved = sessionStorage.getItem(storageKey);\n if (saved) {\n setAnswers(JSON.parse(saved));\n }\n } catch {\n // Ignore\n }\n }\n }, [formId]);\n\n // Save answers on change\n useEffect(() => {\n if (\n Object.keys(answers).length > 0 &&\n typeof sessionStorage !== \"undefined\"\n ) {\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(answers));\n } catch {\n // Ignore\n }\n }\n }, [answers]);\n\n async function loadForm(): Promise<void> {\n setState({ status: \"loading\" });\n onEvent(\"load:start\", { formId });\n\n const response = await api.getPublicForm(formId);\n\n if (!response.success || !response.data) {\n const isRetryable =\n response.status === 0 ||\n (response.status !== undefined && response.status >= 500);\n setState({\n status: \"error\",\n message: response.error || \"Form not found\",\n retryable: isRetryable,\n });\n onEvent(\"load:error\", {\n error: response.error || \"Form not found\",\n retryable: isRetryable,\n });\n onEvent(\"error\", {\n type: \"load\",\n message: response.error || \"Form not found\",\n });\n return;\n }\n\n setState({ status: \"ready\", form: response.data });\n onEvent(\"load:success\", { form: response.data });\n }\n\n function handleAnswerChange(\n questionId: string,\n value: string | string[] | number,\n ): void {\n setAnswers((prev) => ({ ...prev, [questionId]: value }));\n \n // Emit field change event\n if (state.status === \"ready\" || state.status === \"submitting\") {\n const question = state.form.questions.find((q) => q.id === questionId);\n if (question) {\n onEvent(\"field:change\", {\n questionId,\n questionLabel: question.label,\n });\n }\n }\n \n // Clear error when user starts typing\n if (errors[questionId]) {\n setErrors((prev) => {\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n \n function handleFieldFocus(questionId: string): void {\n if (state.status === \"ready\" || state.status === \"submitting\") {\n const question = state.form.questions.find((q) => q.id === questionId);\n if (question) {\n onEvent(\"field:focus\", {\n questionId,\n questionLabel: question.label,\n });\n }\n }\n }\n \n function handleFieldBlur(questionId: string): void {\n if (state.status === \"ready\" || state.status === \"submitting\") {\n const question = state.form.questions.find((q) => q.id === questionId);\n if (question) {\n onEvent(\"field:blur\", {\n questionId,\n questionLabel: question.label,\n });\n }\n }\n }\n\n function validateAnswers(form: FormConfig): boolean {\n const newErrors: Record<string, string> = {};\n\n for (const question of form.questions) {\n const answer = answers[question.id];\n\n if (question.required) {\n if (\n answer === undefined ||\n answer === \"\" ||\n (Array.isArray(answer) && answer.length === 0)\n ) {\n const errorMessage = t(\"required\");\n newErrors[question.id] = errorMessage;\n \n // Emit validation error event\n onEvent(\"field:validation\", {\n questionId: question.id,\n questionLabel: question.label,\n error: errorMessage,\n });\n }\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }\n\n async function handleSubmit(e: Event): Promise<void> {\n e.preventDefault();\n\n if (state.status !== \"ready\") return;\n\n // Check throttle\n if (!canSubmitForm()) {\n setErrors({\n _form: t(\"rateLimited\"),\n });\n return;\n }\n\n // Validate\n if (!validateAnswers(state.form)) {\n return;\n }\n\n setState({ status: \"submitting\", form: state.form });\n\n // Build answers array\n const answersList: Answer[] = Object.entries(answers).map(\n ([questionId, value]) => ({\n questionId,\n value,\n }),\n );\n\n onEvent(\"submit:start\", { answers: answersList });\n\n const response = await api.submitResponse(formId, answersList, {\n hostDomain: typeof window !== \"undefined\" ? window.location.hostname : \"\",\n widgetVersion: VERSION,\n locale,\n sessionId,\n userId,\n });\n\n if (!response.success || !response.data) {\n const isSubmitRetryable =\n response.status === 0 ||\n (response.status !== undefined && response.status >= 500);\n setState({\n status: \"error\",\n message: response.error || \"Submission failed\",\n retryable: isSubmitRetryable,\n form: state.form,\n });\n onEvent(\"submit:error\", {\n error: response.error || \"Submission failed\",\n retryable: isSubmitRetryable,\n });\n onEvent(\"error\", {\n type: \"submit\",\n message: response.error || \"Submission failed\",\n });\n return;\n }\n\n // Record submission for throttling\n recordSubmission();\n\n // Clear saved answers\n if (typeof sessionStorage !== \"undefined\") {\n sessionStorage.removeItem(storageKey);\n }\n\n setState({ status: \"success\", responseId: response.data.responseId });\n onEvent(\"submit:success\", { responseId: response.data.responseId });\n }\n\n function handleRetry(): void {\n if (state.status === \"error\" && state.form) {\n setState({ status: \"ready\", form: state.form });\n } else {\n loadForm();\n }\n }\n\n // Apply theme CSS variables\n const themeStyle = theme\n ? {\n \"--gf-primary-color\": theme.primaryColor,\n \"--gf-background-color\": theme.backgroundColor,\n \"--gf-text-color\": theme.textColor,\n \"--gf-font-family\": theme.fontFamily,\n \"--gf-border-radius\": theme.borderRadius,\n }\n : {};\n\n return (\n <div\n className=\"gf-widget\"\n style={themeStyle}\n role=\"region\"\n aria-label={t(\"formLabel\")}\n >\n {state.status === \"loading\" && (\n <LoadingState loadingText={t(\"loading\")} />\n )}\n\n {state.status === \"ready\" && (\n <FormContent\n form={state.form}\n answers={answers}\n errors={errors}\n onAnswerChange={handleAnswerChange}\n onFieldFocus={handleFieldFocus}\n onFieldBlur={handleFieldBlur}\n onSubmit={handleSubmit}\n showBranding={showBranding}\n submitText={t(\"submit\")}\n npsNotLikely={t(\"npsNotLikely\")}\n npsVeryLikely={t(\"npsVeryLikely\")}\n />\n )}\n\n {state.status === \"submitting\" && (\n <FormContent\n form={state.form}\n answers={answers}\n errors={errors}\n onAnswerChange={handleAnswerChange}\n onFieldFocus={handleFieldFocus}\n onFieldBlur={handleFieldBlur}\n onSubmit={handleSubmit}\n showBranding={showBranding}\n submitText={t(\"submitting\")}\n npsNotLikely={t(\"npsNotLikely\")}\n npsVeryLikely={t(\"npsVeryLikely\")}\n isSubmitting\n />\n )}\n\n {state.status === \"success\" && (\n <SuccessState\n onClose={onClose}\n successTitle={t(\"success\")}\n successMessage={t(\"successMessage\")}\n closeText={t(\"closeModal\")}\n />\n )}\n\n {state.status === \"error\" && (\n <ErrorState\n message={state.message}\n retryable={state.retryable}\n onRetry={handleRetry}\n onClose={onClose}\n errorTitle={t(\"error\")}\n tryAgainText={t(\"tryAgain\")}\n closeText={t(\"closeModal\")}\n />\n )}\n </div>\n );\n}\n\nfunction LoadingState({ loadingText }: { loadingText: string }): JSX.Element {\n return (\n <div\n className=\"gf-loading\"\n role=\"status\"\n aria-label={loadingText}\n aria-live=\"polite\"\n >\n <div className=\"gf-spinner\" aria-hidden=\"true\"></div>\n <p>{loadingText}</p>\n </div>\n );\n}\n\ninterface FormContentProps {\n form: FormConfig;\n answers: Record<string, string | string[] | number>;\n errors: Record<string, string>;\n onAnswerChange: (\n questionId: string,\n value: string | string[] | number,\n ) => void;\n onFieldFocus: (questionId: string) => void;\n onFieldBlur: (questionId: string) => void;\n onSubmit: (e: Event) => void;\n showBranding: boolean;\n submitText: string;\n npsNotLikely: string;\n npsVeryLikely: string;\n isSubmitting?: boolean;\n}\n\nfunction FormContent({\n form,\n answers,\n errors,\n onAnswerChange,\n onFieldFocus,\n onFieldBlur,\n onSubmit,\n showBranding,\n submitText,\n npsNotLikely,\n npsVeryLikely,\n isSubmitting = false,\n}: FormContentProps): JSX.Element {\n return (\n <form className=\"gf-form\" onSubmit={onSubmit} aria-label={form.title}>\n <div>\n <h2 className=\"gf-form-title\" id=\"gf-form-title\">\n {form.title}\n </h2>\n </div>\n\n {errors._form && (\n <div className=\"gf-error-message\" role=\"alert\" aria-live=\"assertive\">\n {errors._form}\n </div>\n )}\n\n {form.questions.map((question) => (\n <Question\n key={question.id}\n question={question}\n value={answers[question.id]}\n onChange={(value) => onAnswerChange(question.id, value)}\n onFocus={() => onFieldFocus(question.id)}\n onBlur={() => onFieldBlur(question.id)}\n error={errors[question.id]}\n npsNotLikely={npsNotLikely}\n npsVeryLikely={npsVeryLikely}\n />\n ))}\n\n <div className=\"gf-form-actions\">\n <Button type=\"submit\" variant=\"primary\" loading={isSubmitting}>\n {submitText}\n </Button>\n </div>\n\n {showBranding && (\n <div className=\"gf-branding\">\n <a\n href=\"https://getforty.club\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"gf-branding-link\"\n >\n Powered by GetForty\n </a>\n </div>\n )}\n </form>\n );\n}\n\nfunction SuccessState({\n onClose,\n successTitle,\n successMessage,\n closeText,\n}: {\n onClose: () => void;\n successTitle: string;\n successMessage: string;\n closeText: string;\n}): JSX.Element {\n return (\n <div className=\"gf-success\" role=\"status\" aria-live=\"polite\">\n <div className=\"gf-success-icon\" aria-hidden=\"true\">\n ✓\n </div>\n <h3 className=\"gf-success-title\">{successTitle}</h3>\n <p className=\"gf-success-message\">\n {successMessage}\n </p>\n <Button variant=\"secondary\" onClick={onClose}>\n {closeText}\n </Button>\n </div>\n );\n}\n\nfunction ErrorState({\n message,\n retryable,\n onRetry,\n onClose,\n errorTitle,\n tryAgainText,\n closeText,\n}: {\n message: string;\n retryable: boolean;\n onRetry: () => void;\n onClose: () => void;\n errorTitle: string;\n tryAgainText: string;\n closeText: string;\n}): JSX.Element {\n return (\n <div className=\"gf-error\" role=\"alert\" aria-live=\"assertive\">\n <div className=\"gf-error-icon\" aria-hidden=\"true\">\n !\n </div>\n <h3 className=\"gf-error-title\">{errorTitle}</h3>\n <p className=\"gf-error-text\">{message}</p>\n <div className=\"gf-form-actions\">\n {retryable && (\n <Button variant=\"primary\" onClick={onRetry}>\n {tryAgainText}\n </Button>\n )}\n <Button variant=\"secondary\" onClick={onClose}>\n {closeText}\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * Widget Styles\n * Exported as a string for Shadow DOM injection\n */\n\nexport const WIDGET_STYLES = `\n/* CSS Custom Properties for Theming */\n:host {\n --gf-primary-color: #6366f1;\n --gf-primary-hover: #4f46e5;\n --gf-background-color: #ffffff;\n --gf-text-color: #1f2937;\n --gf-text-secondary: #6b7280;\n --gf-border-color: #e5e7eb;\n --gf-border-radius: 8px;\n --gf-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n --gf-error-color: #ef4444;\n --gf-success-color: #22c55e;\n \n display: block;\n font-family: var(--gf-font-family);\n color: var(--gf-text-color);\n font-size: 14px;\n line-height: 1.5;\n}\n\n/* Reset */\n*, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\n/* Container */\n.gf-widget {\n background-color: var(--gf-background-color);\n border-radius: var(--gf-border-radius);\n padding: 24px;\n max-width: 480px;\n width: 100%;\n}\n\n/* Form */\n.gf-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.gf-form-title {\n font-size: 20px;\n font-weight: 600;\n color: var(--gf-text-color);\n margin-bottom: 4px;\n}\n\n/* Question */\n.gf-question {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.gf-question-label {\n font-weight: 500;\n color: var(--gf-text-color);\n}\n\n.gf-question-label .gf-required {\n color: var(--gf-error-color);\n margin-left: 2px;\n}\n\n.gf-question-description {\n color: var(--gf-text-secondary);\n font-size: 13px;\n}\n\n/* Input fields */\n.gf-input,\n.gf-textarea,\n.gf-select {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid var(--gf-border-color);\n border-radius: calc(var(--gf-border-radius) - 2px);\n font-size: 14px;\n font-family: var(--gf-font-family);\n color: var(--gf-text-color);\n background-color: var(--gf-background-color);\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.gf-input:focus,\n.gf-textarea:focus,\n.gf-select:focus {\n outline: none;\n border-color: var(--gf-primary-color);\n box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\n}\n\n.gf-input::placeholder,\n.gf-textarea::placeholder {\n color: var(--gf-text-secondary);\n}\n\n.gf-textarea {\n min-height: 100px;\n resize: vertical;\n}\n\n.gf-input-error {\n border-color: var(--gf-error-color);\n}\n\n.gf-error-message {\n color: var(--gf-error-color);\n font-size: 12px;\n margin-top: 4px;\n}\n\n/* Rating / NPS scales */\n.gf-rating-container {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.gf-rating-option {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid var(--gf-border-color);\n border-radius: calc(var(--gf-border-radius) - 2px);\n background-color: var(--gf-background-color);\n color: var(--gf-text-color);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.gf-rating-option:hover {\n border-color: var(--gf-primary-color);\n background-color: rgba(99, 102, 241, 0.05);\n}\n\n.gf-rating-option.selected {\n background-color: var(--gf-primary-color);\n border-color: var(--gf-primary-color);\n color: white;\n}\n\n.gf-rating-labels {\n display: flex;\n justify-content: space-between;\n width: 100%;\n font-size: 12px;\n color: var(--gf-text-secondary);\n margin-top: 8px;\n}\n\n/* Select options */\n.gf-select-options {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.gf-select-option {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n border: 1px solid var(--gf-border-color);\n border-radius: calc(var(--gf-border-radius) - 2px);\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.gf-select-option:hover {\n border-color: var(--gf-primary-color);\n background-color: rgba(99, 102, 241, 0.05);\n}\n\n.gf-select-option.selected {\n border-color: var(--gf-primary-color);\n background-color: rgba(99, 102, 241, 0.1);\n}\n\n.gf-select-option input {\n display: none;\n}\n\n.gf-select-option .gf-radio,\n.gf-select-option .gf-checkbox {\n width: 18px;\n height: 18px;\n border: 2px solid var(--gf-border-color);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.gf-select-option .gf-checkbox {\n border-radius: 4px;\n}\n\n.gf-select-option.selected .gf-radio,\n.gf-select-option.selected .gf-checkbox {\n border-color: var(--gf-primary-color);\n background-color: var(--gf-primary-color);\n}\n\n.gf-select-option.selected .gf-radio::after {\n content: '';\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: white;\n}\n\n.gf-select-option.selected .gf-checkbox::after {\n content: '✓';\n color: white;\n font-size: 12px;\n font-weight: bold;\n}\n\n/* Button */\n.gf-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n font-size: 14px;\n font-weight: 500;\n font-family: var(--gf-font-family);\n border: none;\n border-radius: var(--gf-border-radius);\n cursor: pointer;\n transition: all 0.15s ease;\n min-width: 100px;\n}\n\n.gf-button-primary {\n background-color: var(--gf-primary-color);\n color: white;\n}\n\n.gf-button-primary:hover:not(:disabled) {\n background-color: var(--gf-primary-hover);\n}\n\n.gf-button-secondary {\n background-color: transparent;\n color: var(--gf-text-color);\n border: 1px solid var(--gf-border-color);\n}\n\n.gf-button-secondary:hover:not(:disabled) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.gf-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.gf-button-loading::after {\n content: '';\n width: 16px;\n height: 16px;\n border: 2px solid transparent;\n border-top-color: currentColor;\n border-radius: 50%;\n animation: gf-spin 0.6s linear infinite;\n}\n\n@keyframes gf-spin {\n to { transform: rotate(360deg); }\n}\n\n/* Actions */\n.gf-form-actions {\n display: flex;\n justify-content: flex-end;\n gap: 12px;\n margin-top: 8px;\n}\n\n/* States */\n.gf-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n}\n\n.gf-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--gf-border-color);\n border-top-color: var(--gf-primary-color);\n border-radius: 50%;\n animation: gf-spin 0.8s linear infinite;\n}\n\n.gf-success {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n text-align: center;\n}\n\n.gf-success-icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background-color: var(--gf-success-color);\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n}\n\n.gf-success-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--gf-text-color);\n}\n\n.gf-success-message {\n color: var(--gf-text-secondary);\n}\n\n.gf-error {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n text-align: center;\n}\n\n.gf-error-icon {\n width: 48px;\n height: 48px;\n border-radius: 50%;\n background-color: var(--gf-error-color);\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n}\n\n.gf-error-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--gf-text-color);\n}\n\n.gf-error-text {\n color: var(--gf-text-secondary);\n}\n\n/* Branding */\n.gf-branding {\n display: flex;\n justify-content: center;\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--gf-border-color);\n}\n\n.gf-branding-link {\n color: var(--gf-text-secondary);\n font-size: 12px;\n text-decoration: none;\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.gf-branding-link:hover {\n color: var(--gf-primary-color);\n}\n\n/* Modal */\n.gf-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n padding: 20px;\n}\n\n.gf-modal-content {\n background-color: var(--gf-background-color);\n border-radius: var(--gf-border-radius);\n max-width: 480px;\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n position: relative;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n}\n\n.gf-modal-close {\n position: absolute;\n top: 12px;\n right: 12px;\n width: 32px;\n height: 32px;\n border: none;\n background-color: transparent;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n color: var(--gf-text-secondary);\n transition: all 0.15s ease;\n}\n\n.gf-modal-close:hover {\n background-color: rgba(0, 0, 0, 0.05);\n color: var(--gf-text-color);\n}\n\n/* Focus styles for keyboard navigation */\n.gf-button:focus-visible,\n.gf-input:focus-visible,\n.gf-textarea:focus-visible,\n.gf-select:focus-visible,\n.gf-rating-option:focus-visible,\n.gf-select-option:focus-visible,\n.gf-modal-close:focus-visible {\n outline: 2px solid var(--gf-primary-color);\n outline-offset: 2px;\n}\n`;\n","/**\n * Display API client for fetching pending forms and recording display events\n */\n\nexport interface PendingForm {\n formId: string;\n priority: number;\n reason: \"event_threshold\" | \"time_recurring\" | \"immediate_event\";\n}\n\nexport interface PendingFormsResponse {\n forms: PendingForm[];\n pollIntervalMs: number;\n}\n\nexport interface FormShownRequest {\n formId: string;\n userId?: string;\n sessionId: string;\n timestamp: string;\n}\n\nexport interface FormShownResponse {\n recorded: boolean;\n displayCount: number;\n}\n\nexport interface FormDismissedRequest {\n formId: string;\n userId?: string;\n sessionId: string;\n timestamp: string;\n}\n\nexport interface FormDismissedResponse {\n recorded: boolean;\n}\n\nexport interface DisplayApiConfig {\n baseUrl?: string;\n trackingId: string;\n debug?: boolean;\n}\n\nconst DEFAULT_API_BASE = \"https://getforty.club\";\n\n/**\n * Display API client for communicating with the display conditions backend\n */\nexport class DisplayApi {\n private baseUrl: string;\n private trackingId: string;\n private debug: boolean;\n\n constructor(config: DisplayApiConfig) {\n this.baseUrl = config.baseUrl || DEFAULT_API_BASE;\n this.trackingId = config.trackingId;\n this.debug = config.debug || false;\n }\n\n /**\n * Get pending forms that should be displayed to the user\n */\n async getPendingForms(params: {\n userId?: string;\n sessionId: string;\n page?: string;\n timezone?: string;\n }): Promise<PendingFormsResponse | null> {\n const queryParams = new URLSearchParams();\n if (params.userId) queryParams.set(\"userId\", params.userId);\n queryParams.set(\"sessionId\", params.sessionId);\n if (params.page) queryParams.set(\"page\", params.page);\n if (params.timezone) queryParams.set(\"timezone\", params.timezone);\n\n const url = `${\n this.baseUrl\n }/api/v1/display/pending?${queryParams.toString()}`;\n\n if (this.debug) {\n console.log(\"[GetForty Display] GET\", url);\n }\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Tracking-Id\": this.trackingId,\n },\n });\n\n // 204 No Content means no pending forms\n if (response.status === 204) {\n return null;\n }\n\n if (!response.ok) {\n if (this.debug) {\n console.error(\"[GetForty Display] API Error:\", response.status);\n }\n return null;\n }\n\n const data = await response.json();\n return data as PendingFormsResponse;\n } catch (error) {\n if (this.debug) {\n console.error(\"[GetForty Display] Network error:\", error);\n }\n return null;\n }\n }\n\n /**\n * Record that a form was shown to the user\n */\n async recordFormShown(\n data: FormShownRequest,\n ): Promise<FormShownResponse | null> {\n const url = `${this.baseUrl}/api/v1/display/shown`;\n\n if (this.debug) {\n console.log(\"[GetForty Display] POST\", url, data);\n }\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Tracking-Id\": this.trackingId,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n if (this.debug) {\n console.error(\"[GetForty Display] API Error:\", response.status);\n }\n return null;\n }\n\n return await response.json();\n } catch (error) {\n if (this.debug) {\n console.error(\"[GetForty Display] Network error:\", error);\n }\n return null;\n }\n }\n\n /**\n * Record that a form was dismissed without submission\n */\n async recordFormDismissed(\n data: FormDismissedRequest,\n ): Promise<FormDismissedResponse | null> {\n const url = `${this.baseUrl}/api/v1/display/dismissed`;\n\n if (this.debug) {\n console.log(\"[GetForty Display] POST\", url, data);\n }\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Tracking-Id\": this.trackingId,\n },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n if (this.debug) {\n console.error(\"[GetForty Display] API Error:\", response.status);\n }\n return null;\n }\n\n return await response.json();\n } catch (error) {\n if (this.debug) {\n console.error(\"[GetForty Display] Network error:\", error);\n }\n return null;\n }\n }\n}\n","/**\n * Display Handler - Manages automatic form display based on server-side conditions\n *\n * Polling behavior:\n * - Polling only starts when an event is tracked\n * - Polling stops automatically 20 seconds after the last event\n * - This ensures we only check for forms when there's potential activity\n */\n\nimport { DisplayApi, PendingForm } from \"../api/display\";\nimport { EventEmitter } from \"../utils/emitter\";\n\nexport interface DisplayHandlerConfig {\n displayApi: DisplayApi;\n sessionId: string;\n userId?: string;\n debug?: boolean;\n}\n\nexport interface DisplayHandlerEvents {\n formReady: { formId: string; reason: string };\n pollComplete: { formsCount: number };\n error: { message: string; error?: Error };\n}\n\n// How long to continue polling after the last event (20 seconds)\nconst POLL_TIMEOUT_MS = 20_000;\n\n/**\n * Handles automatic form display based on server-evaluated conditions\n */\nexport class DisplayHandler {\n private config: DisplayHandlerConfig;\n private emitter: EventEmitter<DisplayHandlerEvents>;\n private polling: boolean = false;\n private pollInterval: number = 1000; // Initial poll interval\n private minPollInterval: number = 500;\n private maxPollInterval: number = 10000;\n private pollTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private queue: PendingForm[] = [];\n private isDisplayingForm: boolean = false;\n private lastEventTime: number = 0;\n\n constructor(config: DisplayHandlerConfig) {\n this.config = config;\n this.emitter = new EventEmitter<DisplayHandlerEvents>();\n }\n\n /**\n * Start polling for pending forms (called internally after event)\n */\n private startPolling(): void {\n if (this.polling) return;\n this.polling = true;\n this.pollInterval = this.minPollInterval;\n this.schedulePoll();\n\n if (this.config.debug) {\n console.log(\"[GetForty Display] Started polling for pending forms\");\n }\n }\n\n /**\n * Stop polling for pending forms\n */\n stopPolling(): void {\n this.polling = false;\n if (this.pollTimeoutId) {\n clearTimeout(this.pollTimeoutId);\n this.pollTimeoutId = null;\n }\n\n if (this.config.debug) {\n console.log(\"[GetForty Display] Stopped polling\");\n }\n }\n\n /**\n * Check if polling should continue based on time since last event\n */\n private shouldContinuePolling(): boolean {\n if (this.lastEventTime === 0) return false;\n const timeSinceLastEvent = Date.now() - this.lastEventTime;\n return timeSinceLastEvent < POLL_TIMEOUT_MS;\n }\n\n /**\n * Notify handler that an event was tracked\n * Starts polling if not already polling, resets timeout\n * @param flushPromise - Optional promise to wait for before first poll (e.g., event batch flush)\n */\n onEventTracked(flushPromise?: Promise<void>): void {\n this.lastEventTime = Date.now();\n this.pollInterval = this.minPollInterval;\n\n // Start polling if not already\n if (!this.polling) {\n // Wait for flush promise before first poll to ensure events are on server\n if (flushPromise) {\n flushPromise\n .catch(() => {}) // Ignore flush errors\n .finally(() => this.startPolling());\n } else {\n this.startPolling();\n }\n } else if (!this.isDisplayingForm) {\n // If already polling, trigger an immediate poll\n if (this.pollTimeoutId) {\n clearTimeout(this.pollTimeoutId);\n }\n this.poll();\n }\n }\n\n /**\n * Update the user ID (after identify() is called)\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n }\n\n /**\n * Check if there are forms in the queue\n */\n hasQueuedForms(): boolean {\n return this.queue.length > 0;\n }\n\n /**\n * Get the next form to display\n */\n getNextForm(): PendingForm | null {\n if (this.queue.length === 0) return null;\n return this.queue[0];\n }\n\n /**\n * Mark the current form as displayed and move to next\n */\n markFormDisplayed(formId: string): void {\n this.queue = this.queue.filter((f) => f.formId !== formId);\n this.isDisplayingForm = false;\n\n // Record that form was shown\n this.config.displayApi.recordFormShown({\n formId,\n userId: this.config.userId,\n sessionId: this.config.sessionId,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Mark the current form as dismissed\n */\n markFormDismissed(formId: string): void {\n this.queue = this.queue.filter((f) => f.formId !== formId);\n this.isDisplayingForm = false;\n\n // Record that form was dismissed\n this.config.displayApi.recordFormDismissed({\n formId,\n userId: this.config.userId,\n sessionId: this.config.sessionId,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Mark that we're currently displaying a form\n */\n setDisplayingForm(displaying: boolean): void {\n this.isDisplayingForm = displaying;\n }\n\n /**\n * Subscribe to display events\n */\n on<K extends keyof DisplayHandlerEvents>(\n event: K,\n handler: (data: DisplayHandlerEvents[K]) => void,\n ): () => void {\n return this.emitter.on(event, handler);\n }\n\n /**\n * Schedule the next poll\n */\n private schedulePoll(): void {\n if (!this.polling) return;\n\n this.pollTimeoutId = setTimeout(() => {\n this.poll();\n }, this.pollInterval);\n }\n\n /**\n * Execute a poll for pending forms\n */\n private async poll(): Promise<void> {\n if (!this.polling) return;\n\n // Check if we should stop polling (20 second timeout)\n if (!this.shouldContinuePolling()) {\n if (this.config.debug) {\n console.log(\n \"[GetForty Display] Stopping polling - 20 second timeout reached\",\n );\n }\n this.stopPolling();\n return;\n }\n\n // Don't poll while displaying a form\n if (this.isDisplayingForm) {\n this.schedulePoll();\n return;\n }\n\n try {\n const currentPage =\n typeof window !== \"undefined\" ? window.location.href : undefined;\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n const response = await this.config.displayApi.getPendingForms({\n userId: this.config.userId,\n sessionId: this.config.sessionId,\n page: currentPage,\n timezone,\n });\n\n if (response && response.forms.length > 0) {\n // Add new forms to queue (avoid duplicates)\n const existingIds = new Set(this.queue.map((f) => f.formId));\n const newForms = response.forms.filter(\n (f) => !existingIds.has(f.formId),\n );\n this.queue.push(...newForms);\n\n // Sort by priority\n this.queue.sort((a, b) => a.priority - b.priority);\n\n // Use server-suggested poll interval (capped at max)\n this.pollInterval = Math.min(\n response.pollIntervalMs || this.pollInterval,\n this.maxPollInterval,\n );\n\n // Emit event for each new form\n for (const form of newForms) {\n this.emitter.emit(\"formReady\", {\n formId: form.formId,\n reason: form.reason,\n });\n }\n\n if (this.config.debug) {\n console.log(\"[GetForty Display] Forms ready:\", newForms.length);\n }\n } else {\n // No forms, apply exponential backoff\n this.pollInterval = Math.min(\n this.pollInterval * 2,\n this.maxPollInterval,\n );\n }\n\n this.emitter.emit(\"pollComplete\", { formsCount: this.queue.length });\n } catch (error) {\n if (this.config.debug) {\n console.error(\"[GetForty Display] Poll failed:\", error);\n }\n this.emitter.emit(\"error\", {\n message: \"Failed to poll for pending forms\",\n error: error instanceof Error ? error : undefined,\n });\n\n // On error, apply backoff\n this.pollInterval = Math.min(this.pollInterval * 2, this.maxPollInterval);\n }\n\n // Schedule next poll if still within timeout\n if (this.shouldContinuePolling()) {\n this.schedulePoll();\n } else {\n this.stopPolling();\n }\n }\n}\n","/**\n * GetForty Widget Class\n * Main widget implementation with event tracking and form display capabilities\n */\n\nimport { render, h } from \"preact\";\nimport { EventEmitter } from \"./utils/emitter\";\nimport { Tracker } from \"./tracking/tracker\";\nimport { DataLayerObserver } from \"./tracking/datalayer\";\nimport { Form } from \"./components/Form\";\nimport { WIDGET_STYLES } from \"./styles\";\nimport { DisplayApi } from \"./api/display\";\nimport { DisplayHandler } from \"./display/handler\";\nimport type {\n WidgetConfig,\n WidgetEventMap,\n GetFortyWidgetInstance,\n} from \"./types\";\n\n// Tracking ID regex pattern: gf_ followed by 12 alphanumeric characters\nconst TRACKING_ID_PATTERN = /^gf_[A-Za-z0-9_-]{12}$/;\n\n/**\n * Validate tracking ID format\n */\nfunction isValidTrackingId(trackingId: string): boolean {\n return TRACKING_ID_PATTERN.test(trackingId);\n}\n\n/**\n * GetForty Widget implementation\n */\nexport class GetFortyWidget implements GetFortyWidgetInstance {\n private config: WidgetConfig;\n private emitter: EventEmitter<WidgetEventMap>;\n private tracker: Tracker | null = null;\n private dataLayerObserver: DataLayerObserver | null = null;\n private displayHandler: DisplayHandler | null = null;\n private initialized: boolean = false;\n private debug: boolean;\n private formContainer: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private isFormVisible: boolean = false;\n private currentAutoFormId: string | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private popstateHandler: (() => void) | null = null;\n\n constructor(config: WidgetConfig) {\n this.config = config;\n this.debug = config.debug || false;\n this.emitter = new EventEmitter<WidgetEventMap>();\n }\n\n /**\n * Initialize the widget\n * Called internally after validation\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Validate tracking ID\n if (!this.config.trackingId) {\n throw new Error(\"[GetForty] trackingId is required\");\n }\n\n if (!isValidTrackingId(this.config.trackingId)) {\n throw new Error(\n `[GetForty] Invalid trackingId format. Expected \"gf_\" followed by 12 characters, got \"${this.config.trackingId}\"`,\n );\n }\n\n // Initialize tracker\n this.tracker = new Tracker({\n trackingId: this.config.trackingId,\n baseUrl: this.config.apiBaseUrl,\n debug: this.debug,\n });\n\n // Initialize DataLayer observer if opt-in enabled\n if (this.config.observeDataLayer) {\n this.dataLayerObserver = new DataLayerObserver({\n tracker: this.tracker,\n debug: this.debug,\n eventPrefix: this.config.dataLayerEventPrefix,\n eventFilter: this.config.dataLayerEventFilter,\n });\n\n // Start observing\n this.dataLayerObserver.start();\n\n if (this.debug) {\n console.log(\"[GetForty] DataLayer observer started\");\n }\n }\n\n // Initialize display handler for automatic form display\n if (this.config.autoDisplay !== false) {\n this.initializeDisplayHandler();\n }\n\n // Mark as initialized BEFORE tracking page views\n // so that track() calls succeed\n this.initialized = true;\n\n // Auto track page views if enabled (must be after initialized = true)\n if (this.config.autoTrackPageViews) {\n this.trackPageView();\n this.setupPageViewTracking();\n }\n\n if (this.debug) {\n console.log(\"[GetForty] Widget initialized\", {\n trackingId: this.config.trackingId,\n sessionId: this.tracker.getSessionId(),\n autoDisplay: this.config.autoDisplay !== false,\n });\n }\n }\n\n /** Initialize the display handler for automatic form display\n */\n private initializeDisplayHandler(): void {\n if (!this.tracker) return;\n\n const displayApi = new DisplayApi({\n baseUrl: this.config.apiBaseUrl,\n trackingId: this.config.trackingId,\n debug: this.debug,\n });\n\n this.displayHandler = new DisplayHandler({\n displayApi,\n sessionId: this.tracker.getSessionId(),\n userId: this.tracker.getUserId() || undefined,\n debug: this.debug,\n });\n\n // Listen for forms ready to display\n this.displayHandler.on(\"formReady\", (data) => {\n if (this.debug) {\n console.log(\"[GetForty] Form ready for auto-display:\", data);\n }\n // Auto-show the form if not already displaying one\n if (!this.isFormVisible) {\n this.currentAutoFormId = data.formId;\n this.showForm(data.formId);\n }\n });\n\n // Note: Polling is NOT started here - it starts automatically when\n // an event is tracked via onEventTracked() and stops after 1 minute\n }\n\n /**\n * Track a custom event\n */\n track(eventName: string, properties?: Record<string, unknown>): void {\n if (!this.initialized || !this.tracker) {\n console.warn(\n \"[GetForty] Widget not initialized. Call GetForty.init() first.\",\n );\n return;\n }\n\n if (!eventName || typeof eventName !== \"string\") {\n console.warn(\"[GetForty] Event name is required and must be a string\");\n return;\n }\n\n this.tracker.track(eventName, properties);\n\n // Notify display handler that an event was tracked\n // Flush events first so they're on the server before we poll for pending forms\n if (this.displayHandler) {\n const flushPromise = this.tracker.flush();\n this.displayHandler.onEventTracked(flushPromise);\n }\n }\n\n /**\n * Identify the current user\n * Sends user data to backend and links events/respondents\n */\n async identify(\n userId: string,\n traits?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.initialized || !this.tracker) {\n console.warn(\n \"[GetForty] Widget not initialized. Call GetForty.init() first.\",\n );\n return;\n }\n\n if (!userId || typeof userId !== \"string\") {\n console.warn(\"[GetForty] User ID is required and must be a string\");\n return;\n }\n\n await this.tracker.identify(userId, traits);\n\n\n // Update display handler with user ID\n if (this.displayHandler) {\n this.displayHandler.setUserId(userId);\n }\n }\n\n /**\n * Show a feedback form\n */\n showForm(formId: string): void {\n if (!formId) {\n console.warn(\"[GetForty] Form ID is required.\");\n return;\n }\n\n if (this.isFormVisible) {\n if (this.debug) {\n console.log(\"[GetForty] Form is already visible\");\n }\n return;\n }\n\n if (this.debug) {\n console.log(\"[GetForty] showForm() called\", { formId });\n }\n\n this.renderForm(formId);\n }\n\n /**\n * Hide the currently displayed form\n */\n hideForm(): void {\n if (!this.isFormVisible) {\n return;\n }\n\n if (this.debug) {\n console.log(\"[GetForty] hideForm() called\");\n }\n\n this.unmountForm();\n this.emitter.emit(\"close\", { reason: \"programmatic\" });\n }\n\n /**\n * Subscribe to widget events\n */\n on<K extends keyof WidgetEventMap>(\n event: K,\n callback: (data: WidgetEventMap[K]) => void,\n ): void {\n this.emitter.on(event, callback);\n }\n\n /**\n * Unsubscribe from widget events\n */\n off<K extends keyof WidgetEventMap>(\n event: K,\n callback: (data: WidgetEventMap[K]) => void,\n ): void {\n this.emitter.off(event, callback);\n }\n\n /**\n * Flush any queued events immediately\n */\n async flush(): Promise<void> {\n if (!this.tracker) {\n if (this.debug) {\n console.warn(\"[GetForty] Cannot flush - tracker not initialized\");\n }\n return;\n }\n\n await this.tracker.flush();\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string {\n if (!this.tracker) {\n return \"\";\n }\n return this.tracker.getSessionId();\n }\n\n /**\n * Destroy the widget and clean up resources\n */\n destroy(): void {\n if (this.debug) {\n console.log(\"[GetForty] Destroying widget\");\n }\n\n // Stop display handler polling\n if (this.displayHandler) {\n this.displayHandler.stopPolling();\n }\n\n // Destroy tracker\n // Stop DataLayer observer\n if (this.dataLayerObserver) {\n this.dataLayerObserver.stop();\n }\n\n if (this.tracker) {\n this.tracker.destroy();\n }\n\n // Restore patched History API methods\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n this.originalPushState = null;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n this.originalReplaceState = null;\n }\n if (this.popstateHandler && typeof window !== \"undefined\") {\n window.removeEventListener(\"popstate\", this.popstateHandler);\n this.popstateHandler = null;\n }\n\n // Unmount any visible forms\n this.unmountForm();\n\n // Reset state\n this.initialized = false;\n this.tracker = null;\n this.displayHandler = null;\n }\n\n // ============================================\n // Private methods\n // ============================================\n\n /**\n * Render the form with Shadow DOM encapsulation\n */\n private renderForm(formId: string): void {\n const mode = this.config.mode || \"modal\";\n\n if (mode === \"inline\") {\n this.renderInlineForm(formId);\n } else {\n this.renderModalForm(formId);\n }\n\n this.isFormVisible = true;\n this.emitter.emit(\"open\", { mode });\n }\n\n /**\n * Render form inline in a container\n */\n private renderInlineForm(formId: string): void {\n let container: HTMLElement | null = null;\n\n if (typeof this.config.container === \"string\") {\n container = document.querySelector(this.config.container);\n } else if (this.config.container instanceof HTMLElement) {\n container = this.config.container;\n }\n\n if (!container) {\n console.error(\"[GetForty] Container not found for inline form\");\n return;\n }\n\n // Create shadow host\n const shadowHost = document.createElement(\"div\");\n shadowHost.id = \"getforty-widget\";\n container.appendChild(shadowHost);\n\n // Attach shadow DOM\n this.shadowRoot = shadowHost.attachShadow({ mode: \"open\" });\n this.formContainer = shadowHost;\n\n // Inject styles\n const styleElement = document.createElement(\"style\");\n styleElement.textContent = WIDGET_STYLES;\n this.shadowRoot.appendChild(styleElement);\n\n // Create render target\n const renderTarget = document.createElement(\"div\");\n this.shadowRoot.appendChild(renderTarget);\n\n // Render form\n this.mountForm(renderTarget, formId);\n }\n\n /**\n * Render form in a modal\n */\n private renderModalForm(formId: string): void {\n // Create modal container\n const modalContainer = document.createElement(\"div\");\n modalContainer.id = \"getforty-modal\";\n document.body.appendChild(modalContainer);\n\n // Attach shadow DOM\n this.shadowRoot = modalContainer.attachShadow({ mode: \"open\" });\n this.formContainer = modalContainer;\n\n // Inject styles\n const styleElement = document.createElement(\"style\");\n styleElement.textContent = WIDGET_STYLES;\n this.shadowRoot.appendChild(styleElement);\n\n // Create modal overlay\n const overlay = document.createElement(\"div\");\n overlay.className = \"gf-modal-overlay\";\n overlay.addEventListener(\"click\", (e) => {\n if (e.target === overlay) {\n this.handleClose(\"user\");\n }\n });\n\n // Create modal content\n const modalContent = document.createElement(\"div\");\n modalContent.className = \"gf-modal-content\";\n\n // Create close button\n const closeButton = document.createElement(\"button\");\n closeButton.className = \"gf-modal-close\";\n closeButton.innerHTML = \"✕\";\n closeButton.setAttribute(\"aria-label\", \"Close\");\n closeButton.addEventListener(\"click\", () => this.handleClose(\"user\"));\n modalContent.appendChild(closeButton);\n\n // Create render target\n const renderTarget = document.createElement(\"div\");\n modalContent.appendChild(renderTarget);\n\n overlay.appendChild(modalContent);\n this.shadowRoot.appendChild(overlay);\n\n // Setup keyboard handling\n this.setupKeyboardHandling();\n\n // Render form\n this.mountForm(renderTarget, formId);\n }\n\n /**\n * Mount Preact form component\n */\n private mountForm(target: HTMLElement, formId: string): void {\n // Use h() to create a proper VNode - calling Form() directly breaks hooks\n render(\n h(Form, {\n formId,\n apiBaseUrl: this.config.apiBaseUrl,\n trackingId: this.config.trackingId,\n theme: this.config.theme,\n showBranding: this.config.showBranding !== false,\n locale: this.config.locale || \"en\",\n translations: this.config.translations,\n sessionId: this.tracker?.getSessionId(),\n userId: this.tracker?.getUserId() || undefined,\n debug: this.debug,\n onEvent: (event, data) => this.emitter.emit(event, data),\n onClose: () => this.handleClose(\"submitted\"),\n }),\n target,\n );\n }\n\n /**\n * Unmount and cleanup form\n */\n private unmountForm(): void {\n // Remove keyboard handler\n if (this.keydownHandler) {\n document.removeEventListener(\"keydown\", this.keydownHandler);\n this.keydownHandler = null;\n }\n\n if (this.formContainer) {\n // Unmount Preact\n if (this.shadowRoot) {\n const renderTarget = this.shadowRoot.querySelector(\n \"div:not(.gf-modal-overlay)\",\n );\n if (renderTarget) {\n render(null, renderTarget);\n }\n }\n\n // Remove from DOM\n this.formContainer.remove();\n this.formContainer = null;\n this.shadowRoot = null;\n }\n\n this.isFormVisible = false;\n }\n\n /**\n * Handle form close\n */\n private handleClose(reason: \"user\" | \"submitted\" | \"programmatic\"): void {\n // Notify display handler about form closure\n if (this.displayHandler && this.currentAutoFormId) {\n if (reason === \"submitted\") {\n this.displayHandler.markFormDisplayed(this.currentAutoFormId);\n } else {\n this.displayHandler.markFormDismissed(this.currentAutoFormId);\n }\n this.displayHandler.setDisplayingForm(false);\n }\n this.currentAutoFormId = null;\n\n this.unmountForm();\n this.emitter.emit(\"close\", { reason });\n }\n\n /**\n * Setup keyboard handling for modal\n */\n private setupKeyboardHandling(): void {\n this.keydownHandler = (e: KeyboardEvent): void => {\n if (e.key === \"Escape\" && this.isFormVisible) {\n this.handleClose(\"user\");\n }\n };\n\n document.addEventListener(\"keydown\", this.keydownHandler);\n }\n\n /**\n * Track a page view event\n */\n private trackPageView(): void {\n this.track(\"page_view\", {\n page: typeof window !== \"undefined\" ? window.location.pathname : \"\",\n referrer: typeof document !== \"undefined\" ? document.referrer : \"\",\n title: typeof document !== \"undefined\" ? document.title : \"\",\n url: typeof window !== \"undefined\" ? window.location.href : \"\",\n });\n }\n\n /**\n * Setup automatic page view tracking\n */\n private setupPageViewTracking(): void {\n if (typeof window === \"undefined\") return;\n\n // Track on history changes (SPA navigation)\n this.originalPushState = history.pushState;\n this.originalReplaceState = history.replaceState;\n const widgetSelf = this;\n\n history.pushState = function (...args) {\n widgetSelf.originalPushState!.apply(history, args);\n widgetSelf.trackPageView();\n };\n\n history.replaceState = function (...args) {\n widgetSelf.originalReplaceState!.apply(history, args);\n widgetSelf.trackPageView();\n };\n\n // Track on popstate (back/forward)\n this.popstateHandler = () => {\n this.trackPageView();\n };\n window.addEventListener(\"popstate\", this.popstateHandler);\n }\n}\n\n/**\n * Factory function to create and initialize widget\n */\nexport async function createWidget(\n config: WidgetConfig,\n): Promise<GetFortyWidget> {\n const widget = new GetFortyWidget(config);\n await widget.initialize();\n return widget;\n}\n"],"mappings":"ubAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,cAAAE,GAAA,YAAAC,EAAA,YAAAC,KAAA,eAAAC,GAAAL,ICCO,IC0BMM,EChBPC,ECPFC,GA2FSC,GCoFTC,EAWAC,GAEEC,GA0BAC,GC3MAC,GAaFC,GA+IEC,GACAC,GCzKKC,GNeEC,EAAgC,CAAG,EACnCC,GAAY,CAAA,EACZC,GACZ,oECnBYC,GAAUC,MAAMD,QAStB,SAASE,EAAOC,EAAKC,EAAAA,CAE3B,QAASR,KAAKQ,EAAOD,EAAIP,CAAAA,EAAKQ,EAAMR,CAAAA,EACpC,OAA6BO,CAC9B,CAQgB,SAAAE,GAAWC,EAAAA,CACtBA,GAAQA,EAAKC,YAAYD,EAAKC,WAAWC,YAAYF,CAAAA,CAC1D,CEVgB,SAAAG,GAAcC,EAAMN,EAAOO,EAAAA,CAC1C,IACCC,EACAC,EACAjB,EAHGkB,EAAkB,CAAA,EAItB,IAAKlB,KAAKQ,EACLR,GAAK,MAAOgB,EAAMR,EAAMR,CAAAA,EACnBA,GAAK,MAAOiB,EAAMT,EAAMR,CAAAA,EAC5BkB,EAAgBlB,CAAAA,EAAKQ,EAAMR,CAAAA,EAUjC,GAPImB,UAAUC,OAAS,IACtBF,EAAgBH,SACfI,UAAUC,OAAS,EAAIhC,EAAMiC,KAAKF,UAAW,CAAA,EAAKJ,GAKjC,OAARD,GAAQ,YAAcA,EAAKQ,cHjBnB,KGkBlB,IAAKtB,KAAKc,EAAKQ,aACVJ,EAAgBlB,CAAAA,IADNsB,SAEbJ,EAAgBlB,CAAAA,EAAKc,EAAKQ,aAAatB,CAAAA,GAK1C,OAAOuB,EAAYT,EAAMI,EAAiBF,EAAKC,EHzB5B,IAAA,CG0BpB,CAcgB,SAAAM,EAAYT,EAAMN,EAAOQ,EAAKC,EAAKO,EAAAA,CAIlD,IAAMC,EAAQ,CACbX,KAAAA,EACAN,MAAAA,EACAQ,IAAAA,EACAC,IAAAA,EACAS,IHjDkB,KGkDlBC,GHlDkB,KGmDlBC,IAAQ,EACRC,IHpDkB,KGqDlBC,IHrDkB,KGsDlBC,YAAAA,OACAC,IAAWR,GAAAA,EAAqBlC,GAChC2C,IAAAA,GACAC,IAAQ,CAAA,EAMT,OAFIV,GH7De,MG6DKnC,EAAQoC,OH7Db,MG6D4BpC,EAAQoC,MAAMA,CAAAA,EAEtDA,CACR,CAMgB,SAAAU,EAASC,EAAAA,CACxB,OAAOA,EAAMC,QACd,CC3EO,SAASC,EAAcF,EAAOG,EAAAA,CACpCC,KAAKJ,MAAQA,EACbI,KAAKD,QAAUA,CAChB,CAAA,SA0EgBE,EAAcC,EAAOC,EAAAA,CACpC,GAAIA,GJ3Ee,KI6ElB,OAAOD,EAAKE,GACTH,EAAcC,EAAKE,GAAUF,EAAKG,IAAU,CAAA,EJ9E7B,KImFnB,QADIC,EACGH,EAAaD,EAAKK,IAAWC,OAAQL,IAG3C,IAFAG,EAAUJ,EAAKK,IAAWJ,CAAAA,IJpFR,MIsFKG,EAAOG,KJtFZ,KI0FjB,OAAOH,EAAOG,IAShB,OAA4B,OAAdP,EAAMQ,MAAQ,WAAaT,EAAcC,CAAAA,EJnGpC,IIoGpB,CA4CA,SAASS,GAAwBT,EAAAA,CAAjC,IAGWU,EACJC,EAHN,IAAKX,EAAQA,EAAKE,KJjJC,MIiJoBF,EAAKY,KJjJzB,KIiJ8C,CAEhE,IADAZ,EAAKO,IAAQP,EAAKY,IAAYC,KJlJZ,KImJTH,EAAI,EAAGA,EAAIV,EAAKK,IAAWC,OAAQI,IAE3C,IADIC,EAAQX,EAAKK,IAAWK,CAAAA,IJpJX,MIqJIC,EAAKJ,KJrJT,KIqJwB,CACxCP,EAAKO,IAAQP,EAAKY,IAAYC,KAAOF,EAAKJ,IAC1C,KACD,CAGD,OAAOE,GAAwBT,CAAAA,CAChC,CACD,CA4BO,SAASc,GAAcC,EAAAA,EAAAA,CAE1BA,EAACC,MACDD,EAACC,IAAAA,KACFC,EAAcC,KAAKH,CAAAA,GAAAA,CAClBI,EAAOC,OACTC,IAAgBC,EAAQC,sBAExBF,GAAeC,EAAQC,oBACNC,IAAOL,CAAAA,CAE1B,CASA,SAASA,GAAAA,CAMR,QALIJ,EApGoBU,EAOjBC,EANHC,EACHC,EACAC,EACAC,EAiGAC,EAAI,EAIEd,EAAcX,QAOhBW,EAAcX,OAASyB,GAC1Bd,EAAce,KAAKC,EAAAA,EAGpBlB,EAAIE,EAAciB,MAAAA,EAClBH,EAAId,EAAcX,OAEdS,EAACC,MAhHCU,EAAAA,OANHC,EAAAA,OACHC,GADGD,GADoBF,EAwHNV,GAvHMoB,KACN5B,IACjBsB,EAAc,CAAA,EACdC,EAAW,CAAA,EAERL,EAASW,OACNV,EAAWW,EAAO,CAAE,EAAEV,CAAAA,GACpBQ,IAAaR,EAAQQ,IAAa,EACtCb,EAAQtB,OAAOsB,EAAQtB,MAAM0B,CAAAA,EAEjCY,GACCb,EAASW,IACTV,EACAC,EACAF,EAASc,IACTd,EAASW,IAAYI,aJzII,GI0IzBb,EAAQc,IAAyB,CAACb,CAAAA,EJ3HjB,KI4HjBC,EACAD,GAAiB7B,EAAc4B,CAAAA,EAAYC,CAAAA,EJ5IlB,GI6ItBD,EAAQc,KACXX,CAAAA,EAGDJ,EAAQS,IAAaR,EAAQQ,IAC7BT,EAAQxB,GAAAG,IAAmBqB,EAAQvB,GAAAA,EAAWuB,EAC9CgB,GAAWb,EAAaH,EAAUI,CAAAA,EAClCH,EAAQpB,IAAQoB,EAAQzB,GAAW,KAE/BwB,EAAQnB,KAASqB,GACpBnB,GAAwBiB,CAAAA,IA6F1BP,EAAOC,IAAkB,CAC1B,CG5MgB,SAAAuB,GACfC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACArB,EACAD,EACAuB,EACArB,EAAAA,CAXe,IAaXpB,EAEHiB,EAEAyB,EAEAC,EAEAC,EAiCIC,EA8BAC,EA1DDC,EAAeV,GAAkBA,EAAc1C,KAAeqD,GAE9DC,EAAoBd,EAAavC,OAUrC,IARAsB,EAASgC,GACRd,EACAD,EACAY,EACA7B,EACA+B,CAAAA,EAGIjD,EAAI,EAAGA,EAAIiD,EAAmBjD,KAClC0C,EAAaN,EAAczC,IAAWK,CAAAA,IPjEpB,OOuEjBiB,EADGyB,EAAUjD,KACbwB,GAAWkC,EAEAJ,EAAYL,EAAUjD,GAAAA,GAAY0D,EAI9CT,EAAUjD,IAAUO,EAGhB6C,EAASjB,GACZM,EACAQ,EACAzB,EACAqB,EACAC,EACAC,EACArB,EACAD,EACAuB,EACArB,CAAAA,EAIDuB,EAASD,EAAU7C,IACf6C,EAAWU,KAAOnC,EAASmC,KAAOV,EAAWU,MAC5CnC,EAASmC,KACZC,GAASpC,EAASmC,IPjGF,KOiGaV,CAAAA,EAE9BtB,EAASZ,KACRkC,EAAWU,IACXV,EAAUxC,KAAeyC,EACzBD,CAAAA,GAIEE,GP1Gc,MO0GWD,GP1GX,OO2GjBC,EAAgBD,IAGbG,EAAAA,CAAAA,EPzHsB,EOyHLJ,EAAUX,OACZd,EAAQtB,MAAe+C,EAAU/C,IACnDuB,EAASoC,GAAOZ,EAAYxB,EAAQgB,EAAWY,CAAAA,EACX,OAAnBJ,EAAW5C,MAAQ,YAAc+C,IAAtB/C,OAC5BoB,EAAS2B,EACCF,IACVzB,EAASyB,EAAOY,aAIjBb,EAAUX,KAAAA,IAKX,OAFAK,EAAcvC,IAAQ+C,EAEf1B,CACR,CAOA,SAASgC,GACRd,EACAD,EACAY,EACA7B,EACA+B,EAAAA,CALD,IAQKjD,EAEA0C,EAEAzB,EA8DGuC,EAOAC,EAnEHC,EAAoBX,EAAYnD,OACnC+D,EAAuBD,EAEpBE,EAAO,EAGX,IADAxB,EAAczC,IAAa,IAAIkE,MAAMZ,CAAAA,EAChCjD,EAAI,EAAGA,EAAIiD,EAAmBjD,KAGlC0C,EAAaP,EAAanC,CAAAA,IP5JR,MOgKI,OAAd0C,GAAc,WACA,OAAdA,GAAc,YASA,OAAdA,GAAc,UACA,OAAdA,GAAc,UAEA,OAAdA,GAAc,UACrBA,EAAWoB,aAAeC,OAE1BrB,EAAaN,EAAczC,IAAWK,CAAAA,EAAKgE,EPhL1B,KOkLhBtB,EPlLgB,KAAA,KAAA,IAAA,EOuLPuB,GAAQvB,CAAAA,EAClBA,EAAaN,EAAczC,IAAWK,CAAAA,EAAKgE,EAC1CjF,EACA,CAAEE,SAAUyD,CAAAA,EP1LI,KAAA,KAAA,IAAA,EO+LPA,EAAWoB,cP/LJ,QO+LiCpB,EAAUwB,IAAU,EAKtExB,EAAaN,EAAczC,IAAWK,CAAAA,EAAKgE,EAC1CtB,EAAW5C,KACX4C,EAAW1D,MACX0D,EAAWyB,IACXzB,EAAWU,IAAMV,EAAWU,IPxMZ,KOyMhBV,EAAUjB,GAAAA,EAGXW,EAAczC,IAAWK,CAAAA,EAAK0C,EAGzBc,EAAcxD,EAAI4D,EACxBlB,EAAUlD,GAAW4C,EACrBM,EAAUwB,IAAU9B,EAAc8B,IAAU,EAY5CjD,EP7NkB,MOsNZwC,EAAiBf,EAAUjD,IAAU2E,GAC1C1B,EACAK,EACAS,EACAG,CAAAA,IP1NiB,KOgOjBA,KADA1C,EAAW8B,EAAYU,CAAAA,KAGtBxC,EAAQc,KP3OW,IOkPFd,GPzOD,MOyOqBA,EAAQQ,KPzO7B,MO4ObgC,GAH0ChC,KAkBzCwB,EAAoBS,EACvBE,IACUX,EAAoBS,GAC9BE,KAK4B,OAAnBlB,EAAW5C,MAAQ,aAC7B4C,EAAUX,KP/Qc,IOiRf0B,GAAiBD,IAiBvBC,GAAiBD,EAAc,EAClCI,IACUH,GAAiBD,EAAc,EACzCI,KAEIH,EAAgBD,EACnBI,IAEAA,IAMDlB,EAAUX,KPhTc,KO8KzBK,EAAczC,IAAWK,CAAAA,EPnKR,KO8SnB,GAAI2D,EACH,IAAK3D,EAAI,EAAGA,EAAI0D,EAAmB1D,KAClCiB,EAAW8B,EAAY/C,CAAAA,IPhTN,OATG,EO0TKiB,EAAQc,MAAsB,IAClDd,EAAQpB,KAASqB,IACpBA,EAAS7B,EAAc4B,CAAAA,GAGxBoD,GAAQpD,EAAUA,CAAAA,GAKrB,OAAOC,CACR,CASA,SAASoC,GAAOgB,EAAapD,EAAQgB,EAAWY,EAAAA,CAAhD,IAIM7D,EACKe,EAFV,GAA+B,OAApBsE,EAAYxE,MAAQ,WAAY,CAE1C,IADIb,EAAWqF,EAAW3E,IACjBK,EAAI,EAAGf,GAAYe,EAAIf,EAASW,OAAQI,IAC5Cf,EAASe,CAAAA,IAKZf,EAASe,CAAAA,EAAER,GAAW8E,EACtBpD,EAASoC,GAAOrE,EAASe,CAAAA,EAAIkB,EAAQgB,EAAWY,CAAAA,GAIlD,OAAO5B,CACR,CAAWoD,EAAWzE,KAASqB,IAC1B4B,IACC5B,GAAUoD,EAAYxE,MAAAA,CAASoB,EAAOqD,aACzCrD,EAAS7B,EAAciF,CAAAA,GAExBpC,EAAUsC,aAAaF,EAAWzE,IAAOqB,GP3VxB,IAAA,GO6VlBA,EAASoD,EAAWzE,KAGrB,GACCqB,EAASA,GAAUA,EAAOqC,kBAClBrC,GPlWU,MOkWQA,EAAOuD,UAAY,GAE9C,OAAOvD,CACR,CA4BA,SAASwD,GACRC,EACAC,EACAC,EACAC,EAAAA,CAJD,IAgCMC,EACAC,EAEGC,EA7BFC,EAAMP,EAAWO,IACjBC,EAAOR,EAAWQ,KACpBC,EAAWR,EAAYC,CAAAA,EACrBQ,EAAUD,GP1YG,OATG,EOmZeA,EAAQE,MAAsB,EAiBnE,GACEF,IP5ZiB,MO4ZIF,GAAO,MAC5BG,GAAWH,GAAOE,EAASF,KAAOC,GAAQC,EAASD,KAEpD,OAAON,EACD,GAPNC,GAAwBO,EAAU,EAAI,IAUtC,IAFIN,EAAIF,EAAc,EAClBG,EAAIH,EAAc,EACfE,GAAK,GAAKC,EAAIJ,EAAYW,QAGhC,IADAH,EAAWR,EADLK,EAAaF,GAAK,EAAIA,IAAMC,GAAAA,IPpajB,OATG,EOiblBI,EAAQE,MAAsB,GAC/BJ,GAAOE,EAASF,KAChBC,GAAQC,EAASD,KAEjB,OAAOF,EAKV,MAAA,EACD,CF/bA,SAASO,GAASC,EAAOP,EAAKQ,EAAAA,CACzBR,EAAI,CAAA,GAAM,IACbO,EAAME,YAAYT,EAAKQ,GAAgB,EAAKA,EAE5CD,EAAMP,CAAAA,EADIQ,GLUQ,KKTL,GACa,OAATA,GAAS,UAAYE,GAAmBC,KAAKX,CAAAA,EACjDQ,EAEAA,EAAQ,IAEvB,CAyBgB,SAAAC,EAAYG,EAAKC,EAAML,EAAOM,EAAUC,EAAAA,CAAxC,IACXC,EA8BGC,EA5BPC,EAAG,GAAIL,GAAQ,QACd,GAAoB,OAATL,GAAS,SACnBI,EAAIL,MAAMY,QAAUX,MACd,CAKN,GAJuB,OAAZM,GAAY,WACtBF,EAAIL,MAAMY,QAAUL,EAAW,IAG5BA,EACH,IAAKD,KAAQC,EACNN,GAASK,KAAQL,GACtBF,GAASM,EAAIL,MAAOM,EAAM,EAAA,EAK7B,GAAIL,EACH,IAAKK,KAAQL,EACPM,GAAYN,EAAMK,CAAAA,GAASC,EAASD,CAAAA,GACxCP,GAASM,EAAIL,MAAOM,EAAML,EAAMK,CAAAA,CAAAA,CAIpC,SAGQA,EAAK,CAAA,GAAM,KAAOA,EAAK,CAAA,GAAM,IACrCG,EAAaH,IAASA,EAAOA,EAAKO,QAAQC,GAAe,IAAA,GACnDJ,EAAgBJ,EAAKS,YAAAA,EAI1BT,EADGI,KAAiBL,GAAOC,GAAQ,cAAgBA,GAAQ,YACpDI,EAAcM,MAAM,CAAA,EAChBV,EAAKU,MAAM,CAAA,EAElBX,EAAGY,IAAaZ,EAAGY,EAAc,CAAE,GACxCZ,EAAGY,EAAYX,EAAOG,CAAAA,EAAcR,EAEhCA,EACEM,EAQJN,EAAMiB,EAAYX,EAASW,GAP3BjB,EAAMiB,EAAYC,GAClBd,EAAIe,iBACHd,EACAG,EAAaY,GAAoBC,GACjCb,CAAAA,GAMFJ,EAAIkB,oBACHjB,EACAG,EAAaY,GAAoBC,GACjCb,CAAAA,MAGI,CACN,GAAID,GLtFuB,6BK0F1BF,EAAOA,EAAKO,QAAQ,cAAe,GAAA,EAAKA,QAAQ,SAAU,GAAA,UAE1DP,GAAQ,SACRA,GAAQ,UACRA,GAAQ,QACRA,GAAQ,QACRA,GAAQ,QAGRA,GAAQ,YACRA,GAAQ,YACRA,GAAQ,WACRA,GAAQ,WACRA,GAAQ,QACRA,GAAQ,WACRA,KAAQD,EAER,GAAA,CACCA,EAAIC,CAAAA,EAAQL,GAAgB,GAE5B,MAAMU,CAER,MADUa,CACV,CASoB,OAATvB,GAAS,aAETA,GLvHO,MKuHWA,IAAlBA,IAAqCK,EAAK,CAAA,GAAM,IAG1DD,EAAIoB,gBAAgBnB,CAAAA,EAFpBD,EAAIqB,aAAapB,EAAMA,GAAQ,WAAaL,GAAS,EAAO,GAAKA,CAAAA,EAInE,CACD,CAOA,SAAS0B,GAAiBlB,EAAAA,CAMzB,OAAA,SAAiBe,EAAAA,CAChB,GAAII,KAAIX,EAAa,CACpB,IAAMY,EAAeD,KAAIX,EAAYO,EAAE9B,KAAOe,CAAAA,EAC9C,GAAIe,EAAEM,GL7IW,KK8IhBN,EAAEM,EAAcX,aAKNK,EAAEM,EAAcD,EAAaX,EACvC,OAED,OAAOW,EAAaE,EAAQC,MAAQD,EAAQC,MAAMR,CAAAA,EAAKA,CAAAA,CACxD,CACD,CACD,CAAA,SGzHgBS,GACfC,EACAC,EACAxC,EACAyC,EACA5B,EACA6B,EACAC,EACAC,EACAC,EACAC,EAAAA,CAAAA,IAGIC,EAkBEC,EAAGC,EAAOC,EAAUC,EAAUC,EAAUC,EACxCC,EACEC,EAMFC,EACAC,EAuGOC,EA4BPC,EACHC,EASSF,EA6BNG,EAgDOH,EApPZI,EAAUtB,EAASzC,KAIpB,GAAIyC,EAASuB,cAAb,OAAwC,ORlDrB,KAbU,IQkEzB/D,EAAQE,MACX2C,EAAAA,CAAAA,ERrE0B,GQqET7C,EAAQE,KAEzBwC,EAAoB,CADpBE,EAASJ,EAAQwB,IAAQhE,EAAQgE,GAAAA,IAI7BjB,EAAMX,EAAO6B,MAASlB,EAAIP,CAAAA,EAE/B0B,EAAO,GAAsB,OAAXJ,GAAW,WAC5B,GAAA,CAgEC,GA9DIR,EAAWd,EAAS2B,MAClBZ,EACL,cAAeO,GAAWA,EAAQM,UAAUC,OAKzCb,GADJT,EAAMe,EAAQQ,cACQ7B,EAAcM,EAAGwB,GAAAA,EACnCd,EAAmBV,EACpBS,EACCA,EAASW,MAAM7D,MACfyC,EAAGyB,GACJ/B,EAGCzC,EAAQuE,IAEXlB,GADAL,EAAIR,EAAQ+B,IAAcvE,EAAQuE,KACNC,GAAwBxB,EAACyB,KAGjDlB,EAEHf,EAAQ+B,IAAcvB,EAAI,IAAIc,EAAQR,EAAUG,CAAAA,GAGhDjB,EAAQ+B,IAAcvB,EAAI,IAAI0B,EAC7BpB,EACAG,CAAAA,EAEDT,EAAEe,YAAcD,EAChBd,EAAEqB,OAASM,IAERnB,GAAUA,EAASoB,IAAI5B,CAAAA,EAEtBA,EAAE6B,QAAO7B,EAAE6B,MAAQ,CAAE,GAC1B7B,EAAC8B,IAAkBrC,EACnBQ,EAAQD,EAAC+B,IAAAA,GACT/B,EAACgC,IAAoB,CAAA,EACrBhC,EAACiC,IAAmB,CAAA,GAIjB1B,GAAoBP,EAACkC,KR1GR,OQ2GhBlC,EAACkC,IAAclC,EAAE6B,OAGdtB,GAAoBO,EAAQqB,0BR9Gf,OQ+GZnC,EAACkC,KAAelC,EAAE6B,QACrB7B,EAACkC,IAAcE,EAAO,CAAE,EAAEpC,EAACkC,GAAAA,GAG5BE,EACCpC,EAACkC,IACDpB,EAAQqB,yBAAyB7B,EAAUN,EAACkC,GAAAA,CAAAA,GAI9ChC,EAAWF,EAAEmB,MACbhB,EAAWH,EAAE6B,MACb7B,EAACqC,IAAU7C,EAGPS,EAEFM,GACAO,EAAQqB,0BRjIO,MQkIfnC,EAAEsC,oBRlIa,MQoIftC,EAAEsC,mBAAAA,EAGC/B,GAAoBP,EAAEuC,mBRvIV,MQwIfvC,EAACgC,IAAkBQ,KAAKxC,EAAEuC,iBAAAA,MAErB,CAUN,GARChC,GACAO,EAAQqB,0BR7IO,MQ8If7B,IAAaJ,GACbF,EAAEyC,2BR/Ia,MQiJfzC,EAAEyC,0BAA0BnC,EAAUG,CAAAA,EAItCjB,EAAQ6C,KAAcrF,EAAQqF,KAAAA,CAC5BrC,EAACgB,KACFhB,EAAE0C,uBRvJY,MQwJd1C,EAAE0C,sBACDpC,EACAN,EAACkC,IACDzB,CAAAA,IAJCiC,GAMF,CAkBD,IAhBIlD,EAAQ6C,KAAcrF,EAAQqF,MAKjCrC,EAAEmB,MAAQb,EACVN,EAAE6B,MAAQ7B,EAACkC,IACXlC,EAAC+B,IAAAA,IAGFvC,EAAQwB,IAAQhE,EAAQgE,IACxBxB,EAAQmD,IAAa3F,EAAQ2F,IAC7BnD,EAAQmD,IAAWC,KAAK,SAAAC,EAAAA,CACnBA,IAAOA,EAAKrB,GAAWhC,EAC5B,CAAA,EAESkB,EAAI,EAAGA,EAAIV,EAACiC,IAAiB9E,OAAQuD,IAC7CV,EAACgC,IAAkBQ,KAAKxC,EAACiC,IAAiBvB,CAAAA,CAAAA,EAE3CV,EAACiC,IAAmB,CAAA,EAEhBjC,EAACgC,IAAkB7E,QACtBwC,EAAY6C,KAAKxC,CAAAA,EAGlB,MAAMkB,CACP,CAEIlB,EAAE8C,qBR3LU,MQ4Lf9C,EAAE8C,oBAAoBxC,EAAUN,EAACkC,IAAazB,CAAAA,EAG3CF,GAAoBP,EAAE+C,oBR/LV,MQgMf/C,EAACgC,IAAkBQ,KAAK,UAAA,CACvBxC,EAAE+C,mBAAmB7C,EAAUC,EAAUC,CAAAA,CAC1C,CAAA,CAEF,CASA,GAPAJ,EAAEgD,QAAUvC,EACZT,EAAEmB,MAAQb,EACVN,EAACiD,IAAc1D,EACfS,EAACgB,IAAAA,GAEGL,EAAavB,EAAO8D,IACvBtC,EAAQ,EACLL,EAAkB,CAQrB,IAPAP,EAAE6B,MAAQ7B,EAACkC,IACXlC,EAAC+B,IAAAA,GAEGpB,GAAYA,EAAWnB,CAAAA,EAE3BO,EAAMC,EAAEqB,OAAOrB,EAAEmB,MAAOnB,EAAE6B,MAAO7B,EAAEgD,OAAAA,EAE1BtC,EAAI,EAAGA,EAAIV,EAACiC,IAAiB9E,OAAQuD,IAC7CV,EAACgC,IAAkBQ,KAAKxC,EAACiC,IAAiBvB,CAAAA,CAAAA,EAE3CV,EAACiC,IAAmB,CAAA,CACrB,KACC,IACCjC,EAAC+B,IAAAA,GACGpB,GAAYA,EAAWnB,CAAAA,EAE3BO,EAAMC,EAAEqB,OAAOrB,EAAEmB,MAAOnB,EAAE6B,MAAO7B,EAAEgD,OAAAA,EAGnChD,EAAE6B,MAAQ7B,EAACkC,UACHlC,EAAC+B,KAAAA,EAAanB,EAAQ,IAIhCZ,EAAE6B,MAAQ7B,EAACkC,IAEPlC,EAAEmD,iBRxOW,OQyOhB1D,EAAgB2C,EAAOA,EAAO,CAAE,EAAE3C,CAAAA,EAAgBO,EAAEmD,gBAAAA,CAAAA,GAGjD5C,GAAAA,CAAqBN,GAASD,EAAEoD,yBR5OnB,OQ6OhBhD,EAAWJ,EAAEoD,wBAAwBlD,EAAUC,CAAAA,GAK5CU,EAAed,EADlBA,GRjPgB,MQiPDA,EAAIhD,OAASsG,GAAYtD,EAAIjD,KRjP5B,OQqPhB+D,EAAeyC,GAAUvD,EAAIoB,MAAMoC,QAAAA,GAGpC3D,EAAS4D,GACRjE,EACAkE,GAAQ5C,CAAAA,EAAgBA,EAAe,CAACA,CAAAA,EACxCrB,EACAxC,EACAyC,EACA5B,EACA6B,EACAC,EACAC,EACAC,EACAC,CAAAA,EAGDE,EAAE0D,KAAOlE,EAAQwB,IAGjBxB,EAAQtC,KAAAA,KAEJ8C,EAACgC,IAAkB7E,QACtBwC,EAAY6C,KAAKxC,CAAAA,EAGdK,IACHL,EAACyB,IAAiBzB,EAACwB,GRhRH,KQ6SlB,OA3BS3C,EAAAA,CAGR,GAFAW,EAAQ6C,IRnRS,KQqRbxC,GAAeH,GRrRF,KQsRhB,GAAIb,EAAE8E,KAAM,CAKX,IAJAnE,EAAQtC,KAAW2C,EAChB+D,IRrSsB,IQwSlBhE,GAAUA,EAAOiE,UAAY,GAAKjE,EAAOkE,aAC/ClE,EAASA,EAAOkE,YAGjBpE,EAAkBA,EAAkBqE,QAAQnE,CAAAA,CAAAA,ER/R7B,KQgSfJ,EAAQwB,IAAQpB,CACjB,KAAO,CACN,IAASc,EAAIhB,EAAkBvC,OAAQuD,KACtCsD,GAAWtE,EAAkBgB,CAAAA,CAAAA,EAE9BuD,GAAYzE,CAAAA,CACb,MAEAA,EAAQwB,IAAQhE,EAAQgE,IACxBxB,EAAQmD,IAAa3F,EAAQ2F,IACxB9D,EAAE8E,MAAMM,GAAYzE,CAAAA,EAE1BJ,EAAO4B,IAAanC,EAAGW,EAAUxC,CAAAA,CAClC,MAEA0C,GR/SkB,MQgTlBF,EAAQ6C,KAAcrF,EAAQqF,KAE9B7C,EAAQmD,IAAa3F,EAAQ2F,IAC7BnD,EAAQwB,IAAQhE,EAAQgE,KAExBpB,EAASJ,EAAQwB,IAAQkD,GACxBlH,EAAQgE,IACRxB,EACAxC,EACAyC,EACA5B,EACA6B,EACAC,EACAE,EACAC,CAAAA,EAMF,OAFKC,EAAMX,EAAQ+E,SAASpE,EAAIP,CAAAA,ER/UH,IQiVtBA,EAAQtC,IAAAA,OAAuC0C,CACvD,CAEA,SAASqE,GAAYpB,EAAAA,CAChBA,GAASA,EAAKtB,MAAasB,EAAKtB,IAAAP,IAAAA,IAChC6B,GAASA,EAAKF,KAAYE,EAAKF,IAAWyB,QAAQH,EAAAA,CACvD,CAOO,SAASI,GAAW1E,EAAa2E,EAAMxE,EAAAA,CAC7C,QAASY,EAAI,EAAGA,EAAIZ,EAAS3C,OAAQuD,IACpC6D,GAASzE,EAASY,CAAAA,EAAIZ,EAAAA,EAAWY,CAAAA,EAAIZ,EAAAA,EAAWY,CAAAA,CAAAA,EAG7CtB,EAAOmC,KAAUnC,EAAOmC,IAAS+C,EAAM3E,CAAAA,EAE3CA,EAAYiD,KAAK,SAAA5C,EAAAA,CAChB,GAAA,CAECL,EAAcK,EAACgC,IACfhC,EAACgC,IAAoB,CAAA,EACrBrC,EAAYiD,KAAK,SAAA4B,EAAAA,CAEhBA,EAAGC,KAAKzE,CAAAA,CACT,CAAA,CAGD,OAFSnB,EAAAA,CACRO,EAAO4B,IAAanC,EAAGmB,EAACqC,GAAAA,CACzB,CACD,CAAA,CACD,CAEA,SAASiB,GAAUoB,EAAAA,CAClB,OACgB,OAARA,GAAQ,UACfA,GR1WkB,MQ2WjBA,EAAIzD,KAAWyD,EAAIzD,IAAU,EAEvByD,EAGJjB,GAAQiB,CAAAA,EACJA,EAAKC,IAAIrB,EAAAA,EAGVlB,EAAO,CAAA,EAAIsC,CAAAA,CACnB,CAiBA,SAASR,GACRxG,EACA8B,EACAxC,EACAyC,EACA5B,EACA6B,EACAC,EACAE,EACAC,EAAAA,CATD,IAeKY,EAEAkE,EAEAC,EAEAC,EACAxH,EACAyH,EACAC,EAbA9E,EAAWlD,EAASmE,OAAS8D,EAC7B3E,EAAWd,EAAS2B,MACpB0C,EAAkCrE,EAASzC,KAkB/C,GAJI8G,GAAY,MAAOhG,ERraK,6BQsanBgG,GAAY,OAAQhG,ERpaA,qCQqanBA,IAAWA,ERtaS,gCQwa1B6B,GRrae,MQsalB,IAAKgB,EAAI,EAAGA,EAAIhB,EAAkBvC,OAAQuD,IAMzC,IALApD,EAAQoC,EAAkBgB,CAAAA,IAOzB,iBAAkBpD,GAAAA,CAAAA,CAAWuG,IAC5BA,EAAWvG,EAAM4H,WAAarB,EAAWvG,EAAMuG,UAAY,GAC3D,CACDnG,EAAMJ,EACNoC,EAAkBgB,CAAAA,ERlbF,KQmbhB,KACD,EAIF,GAAIhD,GRxbe,KQwbF,CAChB,GAAImG,GRzbc,KQ0bjB,OAAOsB,SAASC,eAAe9E,CAAAA,EAGhC5C,EAAMyH,SAASE,gBACdxH,EACAgG,EACAvD,EAASgF,IAAMhF,CAAAA,EAKZT,IACCT,EAAOmG,KACVnG,EAAOmG,IAAoB/F,EAAUE,CAAAA,EACtCG,EAAAA,IAGDH,ER3ckB,IQ4cnB,CAEA,GAAImE,GR9ce,KQgdd3D,IAAaI,GAAcT,GAAenC,EAAI8H,MAAQlF,IACzD5C,EAAI8H,KAAOlF,OAEN,CAON,GALAZ,EAAoBA,GAAqBrB,EAAMoG,KAAK/G,EAAI+H,UAAAA,EAAAA,CAKnD5F,GAAeH,GR1dF,KQ4djB,IADAQ,EAAW,CAAA,EACNQ,EAAI,EAAGA,EAAIhD,EAAIgI,WAAWvI,OAAQuD,IAEtCR,GADA5C,EAAQI,EAAIgI,WAAWhF,CAAAA,GACR/C,IAAAA,EAAQL,EAAMA,MAI/B,IAAKoD,KAAKR,EAET,GADA5C,EAAQ4C,EAASQ,CAAAA,EACbA,GAAK,YACEA,GAAAA,GAAK,0BACfmE,EAAUvH,UACA,EAAEoD,KAAKJ,GAAW,CAC5B,GACEI,GAAK,SAAW,iBAAkBJ,GAClCI,GAAK,WAAa,mBAAoBJ,EAEvC,SAED/C,EAAYG,EAAKgD,ER9eD,KQ8eUpD,EAAOO,CAAAA,CAClC,EAKD,IAAK6C,KAAKJ,EACThD,EAAQgD,EAASI,CAAAA,EACbA,GAAK,WACRoE,EAAcxH,EACJoD,GAAK,0BACfkE,EAAUtH,EACAoD,GAAK,QACfqE,EAAazH,EACHoD,GAAK,UACfsE,EAAU1H,EAERuC,GAA+B,OAATvC,GAAS,YACjC4C,EAASQ,CAAAA,IAAOpD,GAEhBC,EAAYG,EAAKgD,EAAGpD,EAAO4C,EAASQ,CAAAA,EAAI7C,CAAAA,EAK1C,GAAI+G,EAGD/E,GACCgF,IACAD,EAAOe,QAAWd,EAAOc,QAAWf,EAAOe,QAAWjI,EAAIkI,aAE5DlI,EAAIkI,UAAYhB,EAAOe,QAGxBnG,EAAQmD,IAAa,CAAA,UAEjBkC,IAASnH,EAAIkI,UAAY,IAE7BpC,GAEChE,EAASzC,MAAQ,WAAaW,EAAImI,QAAUnI,EAC5C+F,GAAQqB,CAAAA,EAAeA,EAAc,CAACA,CAAAA,EACtCtF,EACAxC,EACAyC,EACAoE,GAAY,gBR/hBe,+BQ+hBqBhG,EAChD6B,EACAC,EACAD,EACGA,EAAkB,CAAA,EAClB1C,EAAQ2F,KAAcmD,EAAc9I,EAAU,CAAA,EACjD6C,EACAC,CAAAA,EAIGJ,GRviBa,KQwiBhB,IAAKgB,EAAIhB,EAAkBvC,OAAQuD,KAClCsD,GAAWtE,EAAkBgB,CAAAA,CAAAA,EAM3Bb,IACJa,EAAI,QACAmD,GAAY,YAAckB,GRjjBb,KQkjBhBrH,EAAIoB,gBAAgB,OAAA,EAEpBiG,GRnjBqBgB,OQwjBpBhB,IAAerH,EAAIgD,CAAAA,GAClBmD,GAAY,YAAZA,CAA2BkB,GAI3BlB,GAAY,UAAYkB,GAAc7E,EAASQ,CAAAA,IAEjDnD,EAAYG,EAAKgD,EAAGqE,EAAY7E,EAASQ,CAAAA,EAAI7C,CAAAA,EAG9C6C,EAAI,UACAsE,GRnkBkBe,MQmkBMf,GAAWtH,EAAIgD,CAAAA,GAC1CnD,EAAYG,EAAKgD,EAAGsE,EAAS9E,EAASQ,CAAAA,EAAI7C,CAAAA,EAG7C,CAEA,OAAOH,CACR,CAQgB,SAAA6G,GAASyB,EAAK1I,EAAOuF,EAAAA,CACpC,GAAA,CACC,GAAkB,OAAPmD,GAAO,WAAY,CAC7B,IAAIC,EAAuC,OAAhBD,EAAG9I,KAAa,WACvC+I,GAEHD,EAAG9I,IAAAA,EAGC+I,GAAiB3I,GR5lBL,OQgmBhB0I,EAAG9I,IAAY8I,EAAI1I,CAAAA,EAErB,MAAO0I,EAAIE,QAAU5I,CAGtB,OAFSuB,EAAAA,CACRO,EAAO4B,IAAanC,EAAGgE,CAAAA,CACxB,CACD,CASgB,SAAAsD,GAAQtD,EAAOuD,EAAaC,EAAAA,CAA5B,IACXC,EAsBM5F,EAbV,GARItB,EAAQ+G,SAAS/G,EAAQ+G,QAAQtD,CAAAA,GAEhCyD,EAAIzD,EAAMmD,OACTM,EAAEJ,SAAWI,EAAEJ,SAAWrD,EAAK7B,KACnCuD,GAAS+B,ERrnBQ,KQqnBCF,CAAAA,IAIfE,EAAIzD,EAAKtB,MRznBK,KQynBiB,CACnC,GAAI+E,EAAEC,qBACL,GAAA,CACCD,EAAEC,qBAAAA,CAGH,OAFS1H,EAAAA,CACRO,EAAO4B,IAAanC,EAAGuH,CAAAA,CACxB,CAGDE,EAAE5C,KAAO4C,EAACrD,IRloBQ,IQmoBnB,CAEA,GAAKqD,EAAIzD,EAAKF,IACb,IAASjC,EAAI,EAAGA,EAAI4F,EAAEnJ,OAAQuD,IACzB4F,EAAE5F,CAAAA,GACLyF,GACCG,EAAE5F,CAAAA,EACF0F,EACAC,GAAmC,OAAdxD,EAAM9F,MAAQ,UAARA,EAM1BsJ,GACJrC,GAAWnB,EAAK7B,GAAAA,EAGjB6B,EAAKtB,IAAcsB,EAAKrB,GAAWqB,EAAK7B,IAAAA,MACzC,CAGA,SAASW,GAASR,EAAOU,EAAOmB,EAAAA,CAC/B,OAAA,KAAYjC,YAAYI,EAAO6B,CAAAA,CAChC,CC9pBO,SAAS3B,GAAOwB,EAAOtD,EAAWiH,EAAAA,CAAlC,IAWF3G,EAOA7C,EAQA2C,EACHG,EAzBGP,GAAa4F,WAChB5F,EAAY4F,SAASsB,iBAGlBrH,EAAOoC,IAAQpC,EAAOoC,GAAOqB,EAAOtD,CAAAA,EAYpCvC,GAPA6C,EAAoC,OAAf2G,GAAe,YTRrB,KSiBfA,GAAeA,EAAW7D,KAAepD,EAASoD,IAMlDhD,EAAc,CAAA,EACjBG,EAAW,CAAA,EACZR,GACCC,EAPDsD,GAAAA,CAAWhD,GAAe2G,GAAgBjH,GAASoD,IAClD+D,GAAcrD,ETpBI,KSoBY,CAACR,CAAAA,CAAAA,EAU/B7F,GAAYiI,EACZA,EACA1F,EAAUoH,aAAAA,CACT9G,GAAe2G,EACb,CAACA,CAAAA,EACDxJ,ETnCe,KSqCduC,EAAUqH,WACTvI,EAAMoG,KAAKlF,EAAUkG,UAAAA,ETtCR,KSwClB9F,EAAAA,CACCE,GAAe2G,EACbA,EACAxJ,EACCA,EAAQgE,IACRzB,EAAUqH,WACd/G,EACAC,CAAAA,EAIDuE,GAAW1E,EAAakD,EAAO/C,CAAAA,CAChC,CRzCa+G,EAAQC,GAAUD,MChBzBE,EAAU,CACfC,ISDM,SAAqBC,EAAOC,EAAOC,EAAUC,EAAAA,CAQnD,QANIC,EAEHC,EAEAC,EAEOL,EAAQA,EAAKM,IACpB,IAAKH,EAAYH,EAAKO,MAAAA,CAAiBJ,EAASG,GAC/C,GAAA,CAcC,IAbAF,EAAOD,EAAUK,cAELJ,EAAKK,0BXRD,OWSfN,EAAUO,SAASN,EAAKK,yBAAyBV,CAAAA,CAAAA,EACjDM,EAAUF,EAASQ,KAGhBR,EAAUS,mBXbE,OWcfT,EAAUS,kBAAkBb,EAAOG,GAAa,CAAE,CAAA,EAClDG,EAAUF,EAASQ,KAIhBN,EACH,OAAQF,EAASU,IAAiBV,CAIpC,OAFSW,EAAAA,CACRf,EAAQe,CACT,CAIF,MAAMf,CACP,CAAA,ERzCIgB,GAAU,EA2FDC,GAAiB,SAAAhB,EAAAA,CAAK,OAClCA,GHhFmB,MGgFFA,EAAMQ,cAAvBR,MAAgD,ECrEjDiB,EAAcC,UAAUR,SAAW,SAAUS,EAAQC,EAAAA,CAEpD,IAAIC,EAEHA,EADGC,KAAIC,KJdW,MIcYD,KAAIC,KAAeD,KAAKE,MAClDF,KAAIC,IAEJD,KAAIC,IAAcE,EAAO,CAAA,EAAIH,KAAKE,KAAAA,EAGlB,OAAVL,GAAU,aAGpBA,EAASA,EAAOM,EAAO,CAAA,EAAIJ,CAAAA,EAAIC,KAAKI,KAAAA,GAGjCP,GACHM,EAAOJ,EAAGF,CAAAA,EAIPA,GJ/Be,MIiCfG,KAAIK,MACHP,GACHE,KAAIM,IAAiBC,KAAKT,CAAAA,EAE3BU,GAAcR,IAAAA,EAEhB,EAQAL,EAAcC,UAAUa,YAAc,SAAUX,EAAAA,CAC3CE,KAAIK,MAIPL,KAAIxB,IAAAA,GACAsB,GAAUE,KAAIU,IAAkBH,KAAKT,CAAAA,EACzCU,GAAcR,IAAAA,EAEhB,EAYAL,EAAcC,UAAUe,OAASC,EA+F7BC,EAAgB,CAAA,EAadC,GACa,OAAXC,SAAW,WACfA,QAAQnB,UAAUoB,KAAKC,KAAKF,QAAQG,QAAAA,CAAAA,EACpCC,WAuBEC,GAAY,SAACC,EAAGC,EAAAA,CAAM,OAAAD,EAAChB,IAAAkB,IAAiBD,EAACjB,IAAAkB,GAAc,EA8B7DC,EAAOC,IAAkB,ECzOnBC,GAAgB,8BAalBC,GAAa,EA+IXC,GAAaC,GAAAA,EAAiB,EAC9BC,GAAoBD,GAAAA,EAAiB,ECzKhCE,GAAI,EMKR,IAAMC,EAAN,KAAyD,CAAzD,cACL,KAAQ,UACN,IAAI,IAMN,GACEC,EACAC,EACY,CACZ,OAAK,KAAK,UAAU,IAAID,CAAK,GAC3B,KAAK,UAAU,IAAIA,EAAO,IAAI,GAAK,EAErC,KAAK,UAAU,IAAIA,CAAK,EAAG,IAAIC,CAAkC,EAG1D,IAAM,KAAK,IAAID,EAAOC,CAAQ,CACvC,CAKA,IACED,EACAC,EACM,CACN,IAAMC,EAAiB,KAAK,UAAU,IAAIF,CAAK,EAC3CE,GACFA,EAAe,OAAOD,CAAkC,CAE5D,CAKA,KAA+BD,EAAUG,EAAyB,CAChE,IAAMD,EAAiB,KAAK,UAAU,IAAIF,CAAK,EAC3CE,GACFA,EAAe,QAASD,GAAa,CACnC,GAAI,CACFA,EAASE,CAAI,CACf,OAASC,EAAO,CACd,QAAQ,MACN,+BAA+B,OAAOJ,CAAK,CAAC,KAC5CI,CACF,CACF,CACF,CAAC,CAEL,CAKA,mBAAmBJ,EAA8B,CAC3CA,EACF,KAAK,UAAU,OAAOA,CAAK,EAE3B,KAAK,UAAU,MAAM,CAEzB,CACF,ECvDA,IAAMK,GAA0C,CAC9C,aAAc,GACd,cAAe,IACf,aAAc,GAChB,EAOaC,GAAN,KAAmB,CAOxB,YAAYC,EAA8BC,EAAwB,CAAC,EAAG,CANtE,KAAQ,MAAwB,CAAC,EAGjC,KAAQ,WAAmD,KAC3D,KAAQ,WAAsB,GAG5B,KAAK,OAAS,CAAE,GAAGH,GAAgB,GAAGG,CAAO,EAC7C,KAAK,cAAgBD,CACvB,CAKA,IAAIE,EAA2B,CAI7B,GAHA,KAAK,MAAM,KAAKA,CAAK,EAGjB,KAAK,MAAM,QAAU,KAAK,OAAO,aAAc,CACjD,KAAK,MAAM,EACX,MACF,CAGA,GAAI,KAAK,MAAM,QAAU,KAAK,OAAO,aAAc,CACjD,KAAK,MAAM,EACX,MACF,CAGA,KAAK,cAAc,CACrB,CAKA,QAAQC,EAA8B,CACpCA,EAAO,QAASD,GAAU,KAAK,IAAIA,CAAK,CAAC,CAC3C,CAKA,MAAM,OAAuB,CAE3B,GAAI,KAAK,WAAY,OAGrB,KAAK,qBAAqB,EAG1B,IAAME,EAAgB,KAAK,MAAM,OAAO,EAAG,KAAK,OAAO,YAAY,EACnE,GAAIA,EAAc,SAAW,EAE7B,MAAK,WAAa,GAElB,GAAI,CACF,MAAM,KAAK,cAAcA,CAAa,CACxC,OAASC,EAAO,CAEd,WAAK,MAAM,QAAQ,GAAGD,CAAa,EAC7BC,CACR,QAAE,CACA,KAAK,WAAa,GAGd,KAAK,MAAM,OAAS,GACtB,KAAK,cAAc,CAEvB,EACF,CAKA,MAAe,CACb,OAAO,KAAK,MAAM,MACpB,CAKA,OAAc,CACZ,KAAK,MAAQ,CAAC,EACd,KAAK,qBAAqB,CAC5B,CAKA,UAA2B,CACzB,MAAO,CAAC,GAAG,KAAK,KAAK,CACvB,CAKA,aAAaF,EAA8B,CACzC,KAAK,MAAQ,CAAC,GAAGA,EAAQ,GAAG,KAAK,KAAK,EAClC,KAAK,MAAM,OAAS,GACtB,KAAK,cAAc,CAEvB,CAKA,SAAgB,CACd,KAAK,qBAAqB,EAC1B,KAAK,MAAQ,CAAC,CAChB,CAIQ,eAAsB,CACxB,KAAK,aAAe,OAExB,KAAK,WAAa,WAAW,IAAM,CACjC,KAAK,WAAa,KAClB,KAAK,MAAM,EAAE,MAAM,IAAM,CAEvB,KAAK,cAAc,CACrB,CAAC,CACH,EAAG,KAAK,OAAO,aAAa,EAC9B,CAEQ,sBAA6B,CAC/B,KAAK,aAAe,OACtB,aAAa,KAAK,UAAU,EAC5B,KAAK,WAAa,KAEtB,CACF,EC3JA,IAAMG,GAAmB,wBAgBlB,IAAMC,EAAN,KAAgB,CAKrB,YAAYC,EAA0B,CAAC,EAAG,CACxC,KAAK,QAAUA,EAAO,SAAWC,GACjC,KAAK,QAAUD,EAAO,SAAW,IACjC,KAAK,MAAQA,EAAO,OAAS,EAC/B,CAKA,MAAM,KACJE,EACAC,EAC+B,CAC/B,IAAMC,EAAM,GAAG,KAAK,OAAO,GAAGF,CAAQ,GAElC,KAAK,OACP,QAAQ,IAAI,kBAAmBE,EAAKD,CAAI,EAG1C,IAAME,EAAa,IAAI,gBACjBC,EAAY,WAAW,IAAMD,EAAW,MAAM,EAAG,KAAK,OAAO,EAEnE,GAAI,CACF,IAAME,EAAW,MAAM,MAAMH,EAAK,CAChC,OAAQ,OACR,QAAS,CACP,eAAgB,kBAClB,EACA,KAAM,KAAK,UAAUD,CAAI,EACzB,OAAQE,EAAW,MACrB,CAAC,EAED,aAAaC,CAAS,EAEtB,IAAME,EAAO,MAAMD,EAAS,KAAK,EAEjC,OAAKA,EAAS,IAWV,KAAK,OACP,QAAQ,IAAI,uBAAwBC,CAAI,EAGnC,CACL,QAAS,GACT,KAAMA,EACN,OAAQD,EAAS,MACnB,IAlBM,KAAK,OACP,QAAQ,MAAM,wBAAyBA,EAAS,OAAQC,CAAI,EAEvD,CACL,QAAS,GACT,MAAOA,EAAK,OAAS,QAAQD,EAAS,MAAM,GAC5C,OAAQA,EAAS,MACnB,EAYJ,OAASE,EAAO,CAGd,OAFA,aAAaH,CAAS,EAElBG,aAAiB,MACfA,EAAM,OAAS,aACV,CACL,QAAS,GACT,MAAO,kBACP,OAAQ,GACV,GAGE,KAAK,OACP,QAAQ,MAAM,4BAA6BA,EAAM,OAAO,EAGnD,CACL,QAAS,GACT,MAAOA,EAAM,SAAW,gBACxB,OAAQ,CACV,GAGK,CACL,QAAS,GACT,MAAO,gBACP,OAAQ,CACV,CACF,CACF,CAKA,MAAM,IAAaP,EAAiD,CAClE,IAAME,EAAM,GAAG,KAAK,OAAO,GAAGF,CAAQ,GAElC,KAAK,OACP,QAAQ,IAAI,iBAAkBE,CAAG,EAGnC,IAAMC,EAAa,IAAI,gBACjBC,EAAY,WAAW,IAAMD,EAAW,MAAM,EAAG,KAAK,OAAO,EAEnE,GAAI,CACF,IAAME,EAAW,MAAM,MAAMH,EAAK,CAChC,OAAQ,MACR,QAAS,CACP,eAAgB,kBAClB,EACA,OAAQC,EAAW,MACrB,CAAC,EAED,aAAaC,CAAS,EAEtB,IAAME,EAAO,MAAMD,EAAS,KAAK,EAEjC,OAAKA,EAAS,GAQP,CACL,QAAS,GACT,KAAMC,EACN,OAAQD,EAAS,MACnB,EAXS,CACL,QAAS,GACT,MAAOC,EAAK,OAAS,QAAQD,EAAS,MAAM,GAC5C,OAAQA,EAAS,MACnB,CAQJ,OAASE,EAAO,CAGd,OAFA,aAAaH,CAAS,EAElBG,aAAiB,MACfA,EAAM,OAAS,aACV,CACL,QAAS,GACT,MAAO,kBACP,OAAQ,GACV,EAGK,CACL,QAAS,GACT,MAAOA,EAAM,SAAW,gBACxB,OAAQ,CACV,EAGK,CACL,QAAS,GACT,MAAO,gBACP,OAAQ,CACV,CACF,CACF,CAKA,WAAWL,EAAmB,CAC5B,KAAK,QAAUA,CACjB,CAKA,UAAoB,CAClB,OAAO,OAAO,UAAc,IAAc,UAAU,OAAS,EAC/D,CACF,EC5JO,IAAMM,GAAN,KAAgB,CAKrB,YAAYC,EAAoBC,EAA0B,CAAC,EAAG,CAC5D,KAAK,WAAaD,EAClB,KAAK,MAAQC,EAAO,OAAS,GAC7B,KAAK,OAAS,IAAIC,EAAU,CAC1B,QAASD,EAAO,QAChB,MAAOA,EAAO,KAChB,CAAC,CACH,CAKA,MAAM,WACJE,EAC0C,CAC1C,OAAO,KAAK,OAAO,KASjB,iBAAkB,CAClB,WAAY,KAAK,WACjB,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,UAAWA,EAAM,UACjB,OAAQA,EAAM,MAChB,CAAC,CACH,CAKA,MAAM,WACJC,EAC0C,CAC1C,OAAI,KAAK,OACP,QAAQ,IAAI,8BAA+BA,EAAO,OAAQ,QAAQ,EAG7D,KAAK,OAAO,KAWjB,uBAAwB,CACxB,WAAY,KAAK,WACjB,OAAQA,EAAO,IAAKD,IAAW,CAC7B,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,UAAWA,EAAM,UACjB,OAAQA,EAAM,MAChB,EAAE,CACJ,CAAC,CACH,CAMA,MAAM,SACJE,EACAC,EACAC,EACwC,CACxC,OAAI,KAAK,OACP,QAAQ,IAAI,+BAAgCF,CAAM,EAG7C,KAAK,OAAO,KAQjB,mBAAoB,CACpB,WAAY,KAAK,WACjB,OAAAA,EACA,OAAAC,EACA,YAAAC,CACF,CAAC,CACH,CAKA,UAAoB,CAClB,OAAO,KAAK,OAAO,SAAS,CAC9B,CACF,ECxIA,IAAMC,GAAsB,gBAKrB,SAASC,IAA4B,CAE1C,GAAI,OAAO,OAAW,KAAe,OAAO,WAC1C,MAAO,QAAQ,OAAO,WAAW,EAAE,QAAQ,KAAM,EAAE,EAAE,UAAU,EAAG,EAAE,CAAC,GAIvE,IAAMC,EACJ,iEACEC,EAAS,QACb,QAASC,EAAI,EAAGA,EAAI,GAAIA,IACtBD,GAAUD,EAAM,OAAO,KAAK,MAAM,KAAK,OAAO,EAAIA,EAAM,MAAM,CAAC,EAEjE,OAAOC,CACT,CAKO,SAASE,IAA+B,CAE7C,GAAI,OAAO,eAAmB,IAC5B,GAAI,CACF,IAAMC,EAAS,eAAe,QAAQN,EAAmB,EACzD,GAAIM,EACF,OAAOA,CAEX,MAAQ,CAER,CAIF,IAAMC,EAAYN,GAAkB,EAGpC,OAAAO,GAAiBD,CAAS,EAEnBA,CACT,CAKO,SAASC,GAAiBD,EAAyB,CACxD,GAAI,SAAO,eAAmB,KAE9B,GAAI,CACF,eAAe,QAAQP,GAAqBO,CAAS,CACvD,MAAQ,CAER,CACF,CC9CA,IAAME,GAAwC,CAC5C,WAAY,EACZ,aAAc,IACd,SAAU,IACV,kBAAmB,CACrB,EAKO,SAASC,GACdC,EACAC,EAAsB,CAAC,EACf,CACR,GAAM,CAAE,aAAAC,EAAc,SAAAC,EAAU,kBAAAC,CAAkB,EAAI,CACpD,GAAGN,GACH,GAAGG,CACL,EAGMI,EAAmBH,EAAe,KAAK,IAAIE,EAAmBJ,CAAO,EACrEM,EAAS,KAAK,OAAO,EAAI,GAAMD,EAErC,OAAO,KAAK,IAAIA,EAAmBC,EAAQH,CAAQ,CACrD,CAKA,eAAsBI,GACpBC,EACAP,EAAsB,CAAC,EACX,CACZ,GAAM,CAAE,WAAAQ,CAAW,EAAI,CAAE,GAAGX,GAAgB,GAAGG,CAAO,EAClDS,EAEJ,QAASV,EAAU,EAAGA,GAAWS,EAAYT,IAC3C,GAAI,CACF,OAAO,MAAMQ,EAAG,CAClB,OAASG,EAAO,CAId,GAHAD,EAAYC,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EAGhEX,EAAUS,EAAY,CACxB,IAAMG,EAAQb,GAAsBC,EAASC,CAAM,EACnD,MAAMY,GAAMD,CAAK,CACnB,CACF,CAGF,MAAMF,CACR,CAMO,SAASI,GAAiBC,EAAyB,CAExD,OAAOA,IAAW,GAAMA,GAAU,KAAOA,EAAS,GACpD,CAKA,SAASF,GAAMG,EAA2B,CACxC,OAAO,IAAI,QAASC,GAAY,WAAWA,EAASD,CAAE,CAAC,CACzD,CC9EA,IAAME,GAAuB,iBAKhBC,GAA0B,CAErC,mBAAoB,IAEpB,mBAAoB,GAEpB,gBAAiB,GACnB,EAKO,SAASC,IAAyB,CACvC,GAAI,OAAO,aAAiB,IAAa,MAAO,GAEhD,GAAI,CACF,IAAMC,EAAa,aAAa,QAAQH,EAAoB,EAC5D,OAAKG,EAEW,KAAK,IAAI,EAAI,SAASA,EAAY,EAAE,EACnCF,GAAwB,mBAHjB,EAI1B,MAAQ,CACN,MAAO,EACT,CACF,CAwBO,SAASG,IAAyB,CACvC,GAAI,SAAO,aAAiB,KAE5B,GAAI,CACF,aAAa,QAAQC,GAAsB,KAAK,IAAI,EAAE,SAAS,CAAC,CAClE,MAAQ,CAER,CACF,CAKA,IAAMC,GAAN,KAAuB,CAAvB,cACE,KAAQ,gBAA4B,CAAC,EACrC,KAAQ,OAASC,GAKjB,UAAoB,CAClB,YAAK,mBAAmB,EACjB,KAAK,gBAAgB,OAAS,KAAK,OAAO,kBACnD,CAKA,aAAoB,CAClB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,KAAK,KAAK,IAAI,CAAC,CACtC,CAKA,oBAA6B,CAC3B,YAAK,mBAAmB,EACjB,KAAK,IACV,EACA,KAAK,OAAO,mBAAqB,KAAK,gBAAgB,MACxD,CACF,CAKQ,oBAA2B,CACjC,IAAMC,EAAc,KAAK,IAAI,EAAI,KAAK,OAAO,gBAC7C,KAAK,gBAAkB,KAAK,gBAAgB,OACzCC,GAAOA,EAAKD,CACf,CACF,CACF,EAGaE,GAAmB,IAAIJ,GAK7B,SAASK,IAAyB,CACvC,OAAOD,GAAiB,SAAS,CACnC,CAKO,SAASE,IAA2B,CACzCF,GAAiB,YAAY,CAC/B,CCvGO,IAAMG,GAAN,KAAc,CAOnB,YAAYC,EAAuB,CAyInC,KAAQ,gBAGG,KAgHX,KAAQ,aAAe,SAA2B,CAQhD,GAPA,KAAK,MAAM,SAAW,GAElB,KAAK,OACP,QAAQ,IAAI,oDAAoD,EAI9D,KAAK,gBAAiB,CACxB,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAI,KAAK,gBAChC,KAAK,gBAAkB,KACvB,MAAM,KAAK,SAASD,EAAQC,CAAM,CACpC,CAGA,IAAMC,EAAe,CAAC,GAAG,KAAK,MAAM,UAAU,EAC9C,KAAK,MAAM,WAAa,CAAC,EAErBA,EAAa,OAAS,GACxB,KAAK,QAAQ,QAAQA,CAAY,CAErC,EAEA,KAAQ,cAAgB,IAAY,CAClC,KAAK,MAAM,SAAW,GAElB,KAAK,OACP,QAAQ,IAAI,oDAAoD,CAEpE,EAxRE,KAAK,OAASH,EACd,KAAK,MAAQA,EAAO,OAAS,GAG7B,KAAK,MAAQ,CACX,UAAWI,GAAqB,EAChC,OAAQ,KACR,WAAY,CAAC,EACb,WAAY,CAAC,EACb,WAAY,GACZ,SAAU,OAAO,UAAc,IAAc,UAAU,OAAS,EAClE,EAGA,KAAK,IAAM,IAAIC,GAAUL,EAAO,WAAY,CAC1C,QAASA,EAAO,QAChB,MAAOA,EAAO,KAChB,CAAC,EAGD,KAAK,QAAU,IAAIM,GACjB,MAAOC,GAAW,KAAK,WAAWA,CAAM,EACxCP,CACF,EAGA,KAAK,qBAAqB,EAEtB,KAAK,OACP,QAAQ,IAAI,iCAAkC,CAC5C,UAAW,KAAK,MAAM,UACtB,WAAYA,EAAO,UACrB,CAAC,CAEL,CAKA,MAAMQ,EAAmBC,EAA4C,CAEnE,GAAI,CAACC,GAAc,EAAG,CAChB,KAAK,OACP,QAAQ,KACN,yDACAF,CACF,EAEF,MACF,CAGA,IAAMG,EAAsB,CAC1B,UAAAH,EACA,WAAAC,EACA,UAAW,KAAK,MAAM,UACtB,OAAQ,KAAK,MAAM,QAAU,OAC7B,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,EAGAG,GAAmB,EAGf,KAAK,MAAM,SACb,KAAK,QAAQ,IAAID,CAAK,GAGtB,KAAK,MAAM,WAAW,KAAKA,CAAK,EAChC,KAAK,oBAAoB,GAGvB,KAAK,OACP,QAAQ,IAAI,oCAAqCA,CAAK,CAE1D,CAMA,MAAM,SACJV,EACAC,EACe,CAef,GAbA,KAAK,MAAM,OAASD,EAChBC,IACF,KAAK,MAAM,WAAa,CAAE,GAAG,KAAK,MAAM,WAAY,GAAGA,CAAO,GAIhE,KAAK,eAAe,EAEhB,KAAK,OACP,QAAQ,IAAI,sCAAuCD,EAAQC,CAAM,EAI/D,KAAK,MAAM,SACb,GAAI,CACF,IAAMW,EAAW,MAAM,KAAK,IAAI,SAC9BZ,EACAC,EACA,KAAK,MAAM,SACb,EAEI,KAAK,QACHW,EAAS,SAAWA,EAAS,KAC/B,QAAQ,IAAI,8CAA+C,CACzD,cAAeA,EAAS,KAAK,cAC7B,aAAcA,EAAS,KAAK,aAC5B,kBAAmBA,EAAS,KAAK,iBACnC,CAAC,EAED,QAAQ,KAAK,sCAAuCA,EAAS,KAAK,EAGxE,OAASC,EAAO,CAEV,KAAK,OACP,QAAQ,MAAM,6CAA8CA,CAAK,CAErE,MAGI,KAAK,OACP,QAAQ,IACN,gEACF,EAGF,KAAK,gBAAkB,CAAE,OAAAb,EAAQ,OAAAC,CAAO,CAE5C,CAUA,MAAM,OAAuB,CAC3B,MAAM,KAAK,QAAQ,MAAM,CAC3B,CAKA,cAAuB,CACrB,OAAO,KAAK,MAAM,SACpB,CAKA,WAA2B,CACzB,OAAO,KAAK,MAAM,MACpB,CAKA,eAAyC,CACvC,MAAO,CAAE,GAAG,KAAK,MAAM,UAAW,CACpC,CAKA,UAAoB,CAClB,OAAO,KAAK,MAAM,QACpB,CAKA,SAAgB,CACd,KAAK,QAAQ,QAAQ,EACjB,OAAO,OAAW,MACpB,OAAO,oBAAoB,SAAU,KAAK,YAAY,EACtD,OAAO,oBAAoB,UAAW,KAAK,aAAa,EAE5D,CAOA,MAAc,WAAWK,EAAuC,CAC9D,GAAIA,EAAO,SAAW,EAEtB,IAAI,CAAC,KAAK,MAAM,SAAU,CAExB,KAAK,MAAM,WAAW,KAAK,GAAGA,CAAM,EACpC,KAAK,oBAAoB,EACzB,MACF,CAEA,GAAI,CACF,MAAMQ,GAAU,SAAY,CAC1B,IAAMF,EAAW,MAAM,KAAK,IAAI,WAAWN,CAAM,EAEjD,GAAI,CAACM,EAAS,QAAS,CAErB,GAAIA,EAAS,QAAUG,GAAiBH,EAAS,MAAM,EACrD,MAAM,IAAI,MAAMA,EAAS,OAAS,gBAAgB,EAIpD,QAAQ,MACN,0CACAA,EAAS,KACX,EACA,MACF,CAEI,KAAK,OACP,QAAQ,IACN,+CACAA,EAAS,IACX,CAEJ,EAAG,KAAK,MAAM,CAChB,OAASC,EAAO,CAEd,QAAQ,MACN,0DACAA,CACF,EACA,KAAK,MAAM,WAAW,KAAK,GAAGP,CAAM,EACpC,KAAK,oBAAoB,CAC3B,EACF,CAKQ,sBAA6B,CAC/B,OAAO,OAAW,MAEtB,OAAO,iBAAiB,SAAU,KAAK,YAAY,EACnD,OAAO,iBAAiB,UAAW,KAAK,aAAa,EAGrD,KAAK,oBAAoB,EAC3B,CAoCQ,gBAAuB,CAC7B,GAAI,SAAO,eAAmB,KAE9B,GAAI,CACF,eAAe,QACb,qBACA,KAAK,UAAU,CACb,UAAW,KAAK,MAAM,UACtB,OAAQ,KAAK,MAAM,OACnB,WAAY,KAAK,MAAM,UACzB,CAAC,CACH,CACF,MAAQ,CAER,CACF,CAKQ,qBAA4B,CAClC,GAAI,SAAO,aAAiB,KAE5B,GAAI,CACF,aAAa,QACX,mBACA,KAAK,UAAU,KAAK,MAAM,UAAU,CACtC,CACF,MAAQ,CAER,CACF,CAKQ,qBAA4B,CAClC,GAAI,SAAO,aAAiB,KAE5B,GAAI,CACF,IAAMU,EAAS,aAAa,QAAQ,kBAAkB,EACtD,GAAIA,EAAQ,CACV,IAAMV,EAAS,KAAK,MAAMU,CAAM,EAC5B,MAAM,QAAQV,CAAM,GAAKA,EAAO,OAAS,IACvC,KAAK,OACP,QAAQ,IACN,+BACAA,EAAO,OACP,gBACF,EAGF,KAAK,MAAM,WAAaA,EACxB,aAAa,WAAW,kBAAkB,EAGtC,KAAK,MAAM,UACb,KAAK,aAAa,EAGxB,CACF,MAAQ,CAER,CACF,CACF,ECxWO,IAAMW,GAAN,KAAwB,CAQ7B,YAAYC,EAAiC,CAL7C,KAAQ,aAAyD,KACjE,KAAQ,YAAuB,GAC/B,KAAQ,gBAA+B,IAAI,IAIzC,KAAK,OAASA,EACd,KAAK,QAAUA,EAAO,QACtB,KAAK,YAAcA,EAAO,aAAe,MAC3C,CAKA,OAAc,CACZ,GAAI,KAAK,YAAa,CAChB,KAAK,OAAO,OACd,QAAQ,KAAK,iDAAiD,EAEhE,MACF,CAEA,GAAI,CAEF,IAAMC,EAAY,KAAK,aAAa,EAEpC,GAAI,CAACA,EAAW,CACV,KAAK,OAAO,OACd,QAAQ,KACN,oEACF,EAEF,MACF,CAGA,KAAK,sBAAsBA,CAAS,EAGpC,KAAK,cAAcA,CAAS,EAE5B,KAAK,YAAc,GAEf,KAAK,OAAO,OACd,QAAQ,IAAI,2DAA2D,CAE3E,OAASC,EAAO,CACV,KAAK,OAAO,OACd,QAAQ,MACN,iDACAA,CACF,CAEJ,CACF,CAKA,MAAa,CACX,GAAK,KAAK,YAIV,GAAI,CAEF,IAAMD,EAAY,KAAK,aAAa,EAChCA,GAAa,KAAK,eACpBA,EAAU,KAAO,KAAK,cAGxB,KAAK,YAAc,GACnB,KAAK,gBAAgB,MAAM,EAEvB,KAAK,OAAO,OACd,QAAQ,IAAI,iDAAiD,CAEjE,OAASC,EAAO,CACV,KAAK,OAAO,OACd,QAAQ,MAAM,gDAAiDA,CAAK,CAExE,CACF,CAMQ,cAA6B,CACnC,GAAI,CAEF,IAAMC,EAAe,SAAW,OAAO,OAAS,OAAS,OAAO,OAGhE,OAAKA,EAAqB,UAChBA,EAAqB,WAG3B,KAAK,OAAO,OACd,QAAQ,KACN,0EACF,EAGK,KACT,MAAgB,CAEd,OAAI,KAAK,OAAO,QACd,QAAQ,KACN,6EACF,EACA,QAAQ,KACN,8FACF,GAEK,IACT,CACF,CAKQ,sBAAsBF,EAAwB,CAC/C,MAAM,QAAQA,CAAS,IAI5BA,EAAU,QAAQ,CAACG,EAAMC,IAAU,CACjC,GAAI,KAAK,cAAcD,CAAI,EAAG,CAE5B,IAAME,EAAU,KAAK,WAAWF,EAAMC,CAAK,EAC3C,KAAK,gBAAgB,IAAIC,CAAO,CAKlC,CACF,CAAC,EAEG,KAAK,OAAO,OACd,QAAQ,IACN,2CAA2C,KAAK,gBAAgB,IAAI,6BACtE,EAEJ,CAKQ,cAAcL,EAAwB,CAE5C,KAAK,aAAeA,EAAU,KAAK,KAAKA,CAAS,EAEjD,IAAMM,EAAO,KAGbN,EAAU,KAAO,YAAaO,EAAa,CAEzC,IAAMC,EAASF,EAAK,aAAc,MAAM,KAAMC,CAAI,EAGlD,OAAAA,EAAK,QAASJ,GAAS,CACrB,GAAIG,EAAK,cAAcH,CAAI,EAAG,CAC5B,IAAME,EAAUC,EAAK,WAAWH,EAAMH,EAAU,OAAS,CAAC,EAGrDM,EAAK,gBAAgB,IAAID,CAAO,IACnCC,EAAK,gBAAgB,IAAID,CAAO,EAChCC,EAAK,oBAAoBH,CAAI,EAEjC,CACF,CAAC,EAEMK,CACT,CACF,CAKQ,cAAcC,EAAmB,CACvC,OACEA,GACA,OAAOA,GAAQ,UACf,OAAOA,EAAI,OAAU,UACrBA,EAAI,MAAM,OAAS,CAEvB,CAKQ,WAAWC,EAAYN,EAAuB,CACpD,IAAMO,EAAYD,EAAM,WAAa,KAAK,IAAI,EAC9C,MAAO,GAAGA,EAAM,KAAK,IAAIC,CAAS,IAAIP,CAAK,EAC7C,CAKQ,gBAAgBQ,EAA4B,CAClD,IAAMC,EAAS,KAAK,OAAO,YAE3B,OAAKA,EAIDA,aAAkB,OACbA,EAAO,KAAKD,CAAS,EAG1B,OAAOC,GAAW,WACbA,EAAOD,CAAS,EAGlB,GAXE,EAYX,CAKQ,oBAAoBE,EAAqB,CAC/C,GAAI,CACF,IAAMF,EAAYE,EAAS,MAG3B,GAAI,CAAC,KAAK,gBAAgBF,CAAS,EAAG,CAChC,KAAK,OAAO,OACd,QAAQ,IACN,qDAAqDA,CAAS,EAChE,EAEF,MACF,CAGA,IAAMG,EAAsC,CAAC,EAC7C,QAAWC,KAAOF,EACZE,IAAQ,SAAWF,EAAS,eAAeE,CAAG,IAChDD,EAAWC,CAAG,EAAIF,EAASE,CAAG,GAKlCD,EAAW,QAAU,gBACrBA,EAAW,mBAAqBH,EAGhC,IAAMK,EAAoB,GAAG,KAAK,WAAW,GAAGL,CAAS,GACzD,KAAK,QAAQ,MAAMK,EAAmBF,CAAU,EAE5C,KAAK,OAAO,OACd,QAAQ,IACN,6CAA6CH,CAAS,WAAMK,CAAiB,GAC7EF,CACF,CAEJ,OAASd,EAAO,CACV,KAAK,OAAO,OACd,QAAQ,MACN,qDACAA,CACF,CAEJ,CACF,CACF,ECjSA,IAAIiB,EAGAC,EAGAC,GAsBAC,GAnBAC,GAAc,EAGdC,GAAoB,CAAA,EAGlBC,EAAuDC,EAEzDC,GAAgBF,EAAOG,IACvBC,GAAkBJ,EAAOK,IACzBC,GAAeN,EAAQO,OACvBC,GAAYR,EAAOS,IACnBC,GAAmBV,EAAQW,QAC3BC,GAAUZ,EAAOa,GAiHrB,SAASC,GAAaC,EAAOC,EAAAA,CACxBhB,EAAOiB,KACVjB,EAAOiB,IAAOtB,EAAkBoB,EAAOjB,IAAekB,CAAAA,EAEvDlB,GAAc,EAOd,IAAMoB,EACLvB,EAAgBwB,MACfxB,EAAgBwB,IAAW,CAC3BN,GAAO,CAAA,EACPI,IAAiB,CAAA,CAAA,GAOnB,OAJIF,GAASG,EAAKL,GAAOO,QACxBF,EAAKL,GAAOQ,KAAK,CAAE,CAAA,EAGbH,EAAKL,GAAOE,CAAAA,CACpB,CAOO,SAASO,GAASC,EAAAA,CAExB,OADAzB,GAAc,EACP0B,GAAWC,GAAgBF,CAAAA,CACnC,CAUgB,SAAAC,GAAWE,EAASH,EAAcI,EAAAA,CAEjD,IAAMC,EAAYd,GAAapB,IAAgB,CAAA,EAE/C,GADAkC,EAAUC,EAAWH,EAAAA,CAChBE,EAASnB,MACbmB,EAASf,GAAU,CACjBc,EAAiDA,EAAKJ,CAAAA,EAA/CE,GAAAA,OAA0BF,CAAAA,EAElC,SAAAO,EAAAA,CACC,IAAMC,EAAeH,EAASI,IAC3BJ,EAASI,IAAY,CAAA,EACrBJ,EAASf,GAAQ,CAAA,EACdoB,EAAYL,EAAUC,EAASE,EAAcD,CAAAA,EAE/CC,IAAiBE,IACpBL,EAASI,IAAc,CAACC,EAAWL,EAASf,GAAQ,CAAA,CAAA,EACpDe,EAASnB,IAAYyB,SAAS,CAAE,CAAA,EAElC,CAAA,EAGDN,EAASnB,IAAcd,EAAAA,CAElBA,EAAgBwC,KAAmB,CAAA,IAgC9BC,EAAT,SAAyBC,EAAGC,EAAGC,EAAAA,CAC9B,GAAA,CAAKX,EAASnB,IAAAU,IAAqB,MAAA,GAGnC,IACMqB,EACLZ,EAASnB,IAAAU,IAAAN,GAA0B4B,OAFhB,SAAAC,EAAAA,CAAC,MAAA,CAAA,CAAMA,EAACjC,GAAW,CAAA,EAOvC,GAHsB+B,EAAWG,MAAM,SAAAD,EAAAA,CAAC,MAAA,CAAKA,EAACV,GAAW,CAAA,EAIxD,MAAA,CAAOY,GAAUA,EAAQC,KAAKC,KAAMT,EAAGC,EAAGC,CAAAA,EAM3C,IAAIQ,EAAenB,EAASnB,IAAYuC,QAAUX,EAUlD,OATAG,EAAWS,QAAQ,SAAAC,EAAAA,CAClB,GAAIA,EAAQlB,IAAa,CACxB,IAAMD,EAAemB,EAAQrC,GAAQ,CAAA,EACrCqC,EAAQrC,GAAUqC,EAAQlB,IAC1BkB,EAAQlB,IAAAA,OACJD,IAAiBmB,EAAQrC,GAAQ,CAAA,IAAIkC,EAAAA,GAC1C,CACD,CAAA,EAEOH,GACJA,EAAQC,KAAKC,KAAMT,EAAGC,EAAGC,CAAAA,GACzBQ,CACJ,EA9DApD,EAAgBwC,IAAAA,GAChB,IAAIS,EAAUjD,EAAiBwD,sBACzBC,EAAUzD,EAAiB0D,oBAKjC1D,EAAiB0D,oBAAsB,SAAUhB,EAAGC,EAAGC,EAAAA,CACtD,GAAIO,KAAIQ,IAAS,CAChB,IAAIC,EAAMX,EAEVA,EAAAA,OACAR,EAAgBC,EAAGC,EAAGC,CAAAA,EACtBK,EAAUW,CACX,CAEIH,GAASA,EAAQP,KAAKC,KAAMT,EAAGC,EAAGC,CAAAA,CACvC,EA+CA5C,EAAiBwD,sBAAwBf,CAC1C,CAGD,OAAOR,EAASI,KAAeJ,EAASf,EACzC,CAOO,SAAS2C,GAAUC,EAAUC,EAAAA,CAEnC,IAAMC,EAAQ7C,GAAapB,IAAgB,CAAA,EAAA,CACtCM,EAAO4D,KAAiBC,GAAYF,EAAKxC,IAAQuC,CAAAA,IACrDC,EAAK9C,GAAU4C,EACfE,EAAMG,EAAeJ,EAErB/D,EAAgBwB,IAAAF,IAAyBI,KAAKsC,CAAAA,EAEhD,CAuDgB,SAAAI,GAAQC,EAASC,EAAAA,CAEhC,IAAMC,EAAQC,GAAaC,IAAgB,CAAA,EAO3C,OANIC,GAAYH,EAAKI,IAAQL,CAAAA,IAC5BC,EAAKK,GAAUP,EAAAA,EACfE,EAAKI,IAASL,EACdC,EAAKM,IAAYR,GAGXE,EAAKK,EACb,CA4FA,SAASE,IAAAA,CAER,QADIC,EACIA,EAAYC,GAAkBC,MAAAA,GACrC,GAAKF,EAASG,KAAgBH,EAASI,IACvC,GAAA,CACCJ,EAASI,IAAAC,IAAyBC,QAAQC,EAAAA,EAC1CP,EAASI,IAAAC,IAAyBC,QAAQE,EAAAA,EAC1CR,EAASI,IAAAC,IAA2B,CAAA,CAIrC,OAHSI,EAAAA,CACRT,EAASI,IAAAC,IAA2B,CAAA,EACpCK,EAAOC,IAAaF,EAAGT,EAASY,GAAAA,CACjC,CAEF,CA1aAF,EAAOG,IAAS,SAAAC,EAAAA,CACfC,EAAmB,KACfC,IAAeA,GAAcF,CAAAA,CAClC,EAEAJ,EAAOO,GAAS,SAACH,EAAOI,EAAAA,CACnBJ,GAASI,EAASC,KAAcD,EAASC,IAAAC,MAC5CN,EAAKM,IAASF,EAASC,IAAAC,KAGpBC,IAASA,GAAQP,EAAOI,CAAAA,CAC7B,EAGAR,EAAOY,IAAW,SAAAR,EAAAA,CACbS,IAAiBA,GAAgBT,CAAAA,EAGrCU,EAAe,EAEf,IAAMC,GAHNV,EAAmBD,EAAKY,KAGMtB,IAC1BqB,IACCE,KAAsBZ,GACzBU,EAAKpB,IAAmB,CAAA,EACxBU,EAAgBV,IAAoB,CAAA,EACpCoB,EAAKR,GAAOX,QAAQ,SAAAsB,EAAAA,CACfA,EAAQC,MACXD,EAAQX,GAAUW,EAAQC,KAE3BD,EAASE,EAAeF,EAAQC,IAAAA,MACjC,CAAA,IAEAJ,EAAKpB,IAAiBC,QAAQC,EAAAA,EAC9BkB,EAAKpB,IAAiBC,QAAQE,EAAAA,EAC9BiB,EAAKpB,IAAmB,CAAA,EACxBmB,EAAe,IAGjBG,GAAoBZ,CACrB,EAGAL,EAAQqB,OAAS,SAAAjB,EAAAA,CACZkB,IAAcA,GAAalB,CAAAA,EAE/B,IAAMmB,EAAInB,EAAKY,IACXO,GAAKA,EAAC7B,MACL6B,EAAC7B,IAAAC,IAAyB6B,SAAmBjC,GAAkBkC,KAAKF,CAAAA,IAgalD,GAAKG,KAAY1B,EAAQ2B,yBAC/CD,GAAU1B,EAAQ2B,wBACNC,IAAgBvC,EAAAA,GAja5BkC,EAAC7B,IAAAa,GAAeX,QAAQ,SAAAsB,EAAAA,CACnBA,EAASE,IACZF,EAAQxB,IAASwB,EAASE,GAE3BF,EAASE,EAAAA,MACV,CAAA,GAEDH,GAAoBZ,EAAmB,IACxC,EAIAL,EAAOgB,IAAW,SAACZ,EAAOyB,EAAAA,CACzBA,EAAYC,KAAK,SAAAxC,EAAAA,CAChB,GAAA,CACCA,EAASK,IAAkBC,QAAQC,EAAAA,EACnCP,EAASK,IAAoBL,EAASK,IAAkBoC,OAAO,SAAAC,EAAAA,CAAE,MAAA,CAChEA,EAAEzB,IAAUT,GAAakC,CAAAA,CAAU,CAAA,CAQrC,OANSjC,EAAAA,CACR8B,EAAYC,KAAK,SAAAP,EAAAA,CACZA,EAAC5B,MAAmB4B,EAAC5B,IAAoB,CAAA,EAC9C,CAAA,EACAkC,EAAc,CAAA,EACd7B,EAAOC,IAAaF,EAAGT,EAASY,GAAAA,CACjC,CACD,CAAA,EAEI+B,IAAWA,GAAU7B,EAAOyB,CAAAA,CACjC,EAGA7B,EAAQkC,QAAU,SAAA9B,EAAAA,CACb+B,IAAkBA,GAAiB/B,CAAAA,EAEvC,IAEKgC,EAFCb,EAAInB,EAAKY,IACXO,GAAKA,EAAC7B,MAET6B,EAAC7B,IAAAa,GAAeX,QAAQ,SAAAyC,EAAAA,CACvB,GAAA,CACCxC,GAAcwC,CAAAA,CAGf,OAFStC,EAAAA,CACRqC,EAAarC,CACd,CACD,CAAA,EACAwB,EAAC7B,IAAAA,OACG0C,GAAYpC,EAAOC,IAAamC,EAAYb,EAACrB,GAAAA,EAEnD,EA4UA,IAAIoC,GAA0C,OAAzBX,uBAAyB,WAY9C,SAASC,GAAeW,EAAAA,CACvB,IAOIC,EAPEC,EAAO,UAAA,CACZC,aAAaC,CAAAA,EACTL,IAASM,qBAAqBJ,CAAAA,EAClCK,WAAWN,CAAAA,CACZ,EACMI,EAAUE,WAAWJ,EAlcR,EAAA,EAqcfH,KACHE,EAAMb,sBAAsBc,CAAAA,EAE9B,CAqBA,SAAS5C,GAAciD,EAAAA,CAGtB,IAAMC,EAAO1C,EACT2C,EAAUF,EAAI9B,IACI,OAAXgC,GAAW,aACrBF,EAAI9B,IAAAA,OACJgC,EAAAA,GAGD3C,EAAmB0C,CACpB,CAOA,SAASjD,GAAagD,EAAAA,CAGrB,IAAMC,EAAO1C,EACbyC,EAAI9B,IAAY8B,EAAIvC,GAAAA,EACpBF,EAAmB0C,CACpB,CAOA,SAASE,GAAYC,EAASC,EAAAA,CAC7B,MAAA,CACED,GACDA,EAAQ1B,SAAW2B,EAAQ3B,QAC3B2B,EAAQrB,KAAK,SAACsB,EAAKC,EAAAA,CAAU,OAAAD,IAAQF,EAAQG,CAAAA,CAAM,CAAA,CAErD,CAQA,SAASC,GAAeF,EAAKG,EAAAA,CAC5B,OAAmB,OAALA,GAAK,WAAaA,EAAEH,CAAAA,EAAOG,CAC1C,CEthBa,IChBTC,GAAU,EAwBd,SAASC,EAAYC,EAAMC,EAAOC,EAAKC,EAAkBC,EAAUC,EAAAA,CAC7DJ,IAAOA,EAAQ,CAAA,GAIpB,IACCK,EACAC,EAFGC,EAAkBP,EAItB,GAAI,QAASO,EAEZ,IAAKD,KADLC,EAAkB,CAAA,EACRP,EACLM,GAAK,MACRD,EAAML,EAAMM,CAAAA,EAEZC,EAAgBD,CAAAA,EAAKN,EAAMM,CAAAA,EAM9B,IAAME,EAAQ,CACbT,KAAAA,EACAC,MAAOO,EACPN,IAAAA,EACAI,IAAAA,EACAI,IAAW,KACXC,GAAS,KACTC,IAAQ,EACRC,IAAM,KACNC,IAAY,KACZC,YAAAA,OACAC,IAAAA,EAAaC,GACbC,IAAAA,GACAC,IAAQ,EACRf,SAAAA,EACAC,OAAAA,CAAAA,EAKD,GAAoB,OAATL,GAAS,aAAeM,EAAMN,EAAKoB,cAC7C,IAAKb,KAAKD,EACLE,EAAgBD,CAAAA,IADXD,SAERE,EAAgBD,CAAAA,EAAKD,EAAIC,CAAAA,GAK5B,OADIc,EAAQZ,OAAOY,EAAQZ,MAAMA,CAAAA,EAC1BA,CACR,CC7DO,SAASa,EAAO,CACrB,SAAAC,EACA,QAAAC,EACA,KAAAC,EAAO,SACP,QAAAC,EAAU,UACV,SAAAC,EAAW,GACX,QAAAC,EAAU,GACV,UAAAC,EAAY,EACd,EAA6B,CAM3B,OACEC,EAAC,UACC,KAAML,EACN,QAASD,EACT,SAAUG,GAAYC,EACtB,UAAW,aARbF,IAAY,UAAY,oBAAsB,qBAQL,IAPtBE,EAAU,oBAAsB,EAOM,IAAIC,CAAS,GAAG,KAAK,EAC5E,YAAWD,EAEV,SAAAA,EAAU,GAAKL,EAClB,CAEJ,CCvBO,SAASQ,GAAS,CACvB,SAAAC,EACA,MAAAC,EACA,SAAAC,EACA,MAAAC,EACA,QAAAC,EACA,OAAAC,EACA,aAAAC,EAAe,aACf,cAAAC,EAAgB,aAClB,EAA+B,CAC7B,IAAMC,EAAW,EAAQL,EAEzB,OACEM,EAAC,OACC,UAAU,cACV,KAAK,QACL,kBAAiB,SAAST,EAAS,EAAE,GACrC,mBACEA,EAAS,YAAc,QAAQA,EAAS,EAAE,GAAK,OAGjD,UAAAS,EAAC,SAAM,GAAI,SAAST,EAAS,EAAE,GAAI,UAAU,oBAC1C,UAAAA,EAAS,MACTA,EAAS,UACRS,EAAC,QAAK,UAAU,cAAc,cAAY,OAAO,aAEjD,EAEDT,EAAS,UAAYS,EAAC,QAAK,UAAU,aAAa,uBAAW,GAChE,EAECT,EAAS,aACRS,EAAC,KAAE,GAAI,QAAQT,EAAS,EAAE,GAAI,UAAU,0BACrC,SAAAA,EAAS,YACZ,EAGDU,GAAYV,EAAUC,EAAOC,EAAUM,EAAUJ,EAASC,EAAQC,EAAcC,CAAa,EAE7FJ,GACCM,EAAC,KAAE,UAAU,mBAAmB,KAAK,QAAQ,YAAU,SACpD,SAAAN,EACH,GAEJ,CAEJ,CAEA,SAASO,GACPV,EACAC,EACAC,EACAM,EACAJ,EACAC,EACAC,EACAC,EACa,CACb,OAAQP,EAAS,KAAM,CACrB,IAAK,MACH,OACES,EAACE,GAAA,CACC,SAAUX,EACV,MAAOC,EACP,SAAUC,EACV,QAASE,EACT,eAAgBE,GAAgB,aAChC,gBAAiBC,GAAiB,cACpC,EAEJ,IAAK,SACL,IAAK,QACH,OACEE,EAACG,GAAA,CACC,SAAUZ,EACV,MAAOC,EACP,SAAUC,EACV,QAASE,EACX,EAEJ,IAAK,WACH,OACEK,EAACI,GAAA,CACC,SAAUb,EACV,MAAOC,EACP,SAAUC,EACV,SAAUM,EACV,QAASJ,EACT,OAAQC,EACV,EAEJ,IAAK,SACH,OACEI,EAACK,GAAA,CACC,SAAUd,EACV,MAAOC,EACP,SAAUC,EACV,QAASE,EACX,EAEJ,IAAK,cACH,OACEK,EAACM,GAAA,CACC,SAAUf,EACV,MAAOC,EACP,SAAUC,EACV,QAASE,EACX,EAGJ,QACE,OACEK,EAACO,GAAA,CACC,SAAUhB,EACV,MAAOC,EACP,SAAUC,EACV,SAAUM,EACV,QAASJ,EACT,OAAQC,EACV,CAEN,CACF,CAGA,SAASM,GAAS,CAChB,SAAAX,EACA,MAAAC,EACA,SAAAC,EACA,QAAAE,EACA,eAAAa,EACA,gBAAAC,CACF,EAOgB,CACd,OACET,EAAC,OACC,UAAU,sBACV,KAAK,aACL,aAAYT,EAAS,MAEpB,gBAAM,KAAK,CAAE,OAAQ,EAAG,EAAG,CAACmB,EAAGC,IAC9BX,EAAC,UAEC,KAAK,SACL,UAAW,oBAAoBR,IAAUmB,EAAI,WAAa,EAAE,GAC5D,QAAS,IAAMlB,EAASkB,CAAC,EACzB,QAAS,IAAMhB,IAAU,EACzB,KAAK,QACL,eAAcH,IAAUmB,EACxB,aAAY,GAAGA,CAAC,GAEf,SAAAA,GATIA,CAUP,CACD,EACDX,EAAC,OAAI,UAAU,mBACb,UAAAA,EAAC,QAAM,SAAAQ,EAAe,EACtBR,EAAC,QAAM,SAAAS,EAAgB,GACzB,GACF,CAEJ,CAGA,SAASN,GAAY,CACnB,SAAAZ,EACA,MAAAC,EACA,SAAAC,EACA,QAAAE,CACF,EAKgB,CAGd,OACEK,EAAC,OACC,UAAU,sBACV,KAAK,aACL,aAAYT,EAAS,MAEpB,eAAM,KAAK,CAAE,OAAQ,CAAI,EAAG,CAACmB,EAAGC,IAC/BX,EAAC,UAEC,KAAK,SACL,UAAW,oBAAoBR,IAAUmB,EAAI,EAAI,WAAa,EAAE,GAChE,QAAS,IAAMlB,EAASkB,EAAI,CAAC,EAC7B,QAAS,IAAMhB,IAAU,EACzB,KAAK,QACL,eAAcH,IAAUmB,EAAI,EAC5B,aAAY,GAAGA,EAAI,CAAC,GAEnB,SAAAA,EAAI,GATAA,EAAI,CAUX,CACD,EACH,CAEJ,CAGA,SAASJ,GAAU,CACjB,SAAAhB,EACA,MAAAC,EACA,SAAAC,EACA,SAAAM,EACA,QAAAJ,EACA,OAAAC,CACF,EAOgB,CACd,OACEI,EAAC,SACC,KAAK,OACL,GAAIT,EAAS,GACb,UAAW,YAAYQ,EAAW,iBAAmB,EAAE,GACvD,MAAOP,GAAS,GAChB,QAAUoB,GAAMnB,EAAUmB,EAAE,OAA4B,KAAK,EAC7D,QAAS,IAAMjB,IAAU,EACzB,OAAQ,IAAMC,IAAS,EACvB,SAAUL,EAAS,SACnB,UAAWA,EAAS,YAAY,UAChC,UAAWA,EAAS,YAAY,UAChC,eAAcQ,EAChB,CAEJ,CAGA,SAASK,GAAc,CACrB,SAAAb,EACA,MAAAC,EACA,SAAAC,EACA,SAAAM,EACA,QAAAJ,EACA,OAAAC,CACF,EAOgB,CACd,OACEI,EAAC,YACC,GAAIT,EAAS,GACb,UAAW,eAAeQ,EAAW,iBAAmB,EAAE,GAC1D,MAAOP,GAAS,GAChB,QAAUoB,GAAMnB,EAAUmB,EAAE,OAA+B,KAAK,EAChE,QAAS,IAAMjB,IAAU,EACzB,OAAQ,IAAMC,IAAS,EACvB,SAAUL,EAAS,SACnB,UAAWA,EAAS,YAAY,UAChC,UAAWA,EAAS,YAAY,UAChC,eAAcQ,EAChB,CAEJ,CAGA,SAASM,GAAY,CACnB,SAAAd,EACA,MAAAC,EACA,SAAAC,EACA,QAAAE,CACF,EAKgB,CACd,IAAMkB,EAAUtB,EAAS,SAAW,CAAC,EAErC,OACES,EAAC,OACC,UAAU,oBACV,KAAK,aACL,aAAYT,EAAS,MAEpB,SAAAsB,EAAQ,IAAKC,GACZd,EAAC,SAEC,UAAW,oBACTR,IAAUsB,EAAO,MAAQ,WAAa,EACxC,GAEA,UAAAd,EAAC,SACC,KAAK,QACL,KAAMT,EAAS,GACf,MAAOuB,EAAO,MACd,QAAStB,IAAUsB,EAAO,MAC1B,SAAU,IAAMrB,EAASqB,EAAO,KAAK,EACrC,QAAS,IAAMnB,IAAU,EACzB,eAAcH,IAAUsB,EAAO,MACjC,EACAd,EAAC,QAAK,UAAU,WAAW,cAAY,OAAO,EAC7Cc,EAAO,QAfHA,EAAO,KAgBd,CACD,EACH,CAEJ,CAGA,SAASR,GAAiB,CACxB,SAAAf,EACA,MAAAC,EACA,SAAAC,EACA,QAAAE,CACF,EAKgB,CACd,IAAMkB,EAAUtB,EAAS,SAAW,CAAC,EAC/BwB,EAAWvB,GAAS,CAAC,EAErBwB,EAAgBC,GAA8B,CAC9CF,EAAS,SAASE,CAAW,EAC/BxB,EAASsB,EAAS,OAAQG,GAAMA,IAAMD,CAAW,CAAC,EAElDxB,EAAS,CAAC,GAAGsB,EAAUE,CAAW,CAAC,CAEvC,EAEA,OACEjB,EAAC,OAAI,UAAU,oBAAoB,KAAK,QAAQ,aAAYT,EAAS,MAClE,SAAAsB,EAAQ,IAAKC,GACZd,EAAC,SAEC,UAAW,oBACTe,EAAS,SAASD,EAAO,KAAK,EAAI,WAAa,EACjD,GAEA,UAAAd,EAAC,SACC,KAAK,WACL,KAAMT,EAAS,GACf,MAAOuB,EAAO,MACd,QAASC,EAAS,SAASD,EAAO,KAAK,EACvC,SAAU,IAAME,EAAaF,EAAO,KAAK,EACzC,QAAS,IAAMnB,IAAU,EAC3B,EACAK,EAAC,QAAK,UAAU,cAAc,cAAY,OAAO,EAChDc,EAAO,QAdHA,EAAO,KAed,CACD,EACH,CAEJ,CCvUO,IAAMK,GAAN,KAAe,CAIpB,YAAYC,EAAyB,CAAC,EAAG,CACvC,KAAK,WAAaA,EAAO,WACzB,KAAK,OAAS,IAAIC,EAAU,CAC1B,QAASD,EAAO,QAChB,MAAOA,EAAO,KAChB,CAAC,CACH,CAKA,MAAM,cAAcE,EAAkD,CAEpE,IAAMC,EAAW,MAAM,KAAK,OAAO,IACjC,iBAAiB,mBAAmBD,CAAM,CAAC,EAC7C,EAEA,GAAI,CAACC,EAAS,SAAW,CAACA,EAAS,KACjC,MAAO,CACL,QAAS,GACT,MAAOA,EAAS,OAAS,iBACzB,OAAQA,EAAS,MACnB,EAIF,IAAMC,EAAOD,EAAS,KAStB,MAAO,CACL,QAAS,GACT,KAV6B,CAC7B,GAAIC,EAAK,GACT,MAAOA,EAAK,MACZ,KAAMA,EAAK,KACX,UAAW,KAAK,mBAAmBA,EAAK,eAAe,EACvD,SAAUA,EAAK,cACjB,EAKE,OAAQD,EAAS,MACnB,CACF,CAKA,MAAM,eACJD,EACAG,EACAC,EAC4C,CAE5C,IAAMC,EAA4D,CAAC,EACnE,QAAWC,KAAUH,EACnBE,EAAWC,EAAO,UAAU,EAAIA,EAAO,MAIzC,OAAO,KAAK,OAAO,KACjB,oBACA,CACE,OAAAN,EACA,QAASK,EACT,WAAY,KAAK,WACjB,OAAQ,QACR,SAAAD,CACF,CACF,CACF,CAKQ,mBACNG,EACyB,CACzB,OAAK,MAAM,QAAQA,CAAe,EAE3BA,EAAgB,IAAKC,GAAe,CACzC,IAAMC,EAAWD,EACjB,MAAO,CACL,GAAI,OAAOC,EAAS,IAAM,EAAE,EAC5B,KAAM,KAAK,gBAAgB,OAAOA,EAAS,MAAQ,MAAM,CAAC,EAC1D,MAAO,OAAOA,EAAS,OAASA,EAAS,MAAQ,EAAE,EACnD,YAAaA,EAAS,YAClB,OAAOA,EAAS,WAAW,EAC3B,OACJ,SAAU,EAAQA,EAAS,SAC3B,QAAS,KAAK,iBAAiBA,EAAS,OAAO,EAC/C,WACEA,EAAS,UACb,CACF,CAAC,EAhB2C,CAAC,CAiB/C,CAKQ,gBAAgBC,EAAkD,CAgBxE,MAfoE,CAClE,OAAQ,SACR,IAAK,MACL,KAAM,OACN,SAAU,WACV,OAAQ,SACR,YAAa,cACb,MAAO,QACP,OAAQ,SACR,aAAc,OACd,YAAa,WAEb,aAAc,SACd,eAAgB,aAClB,EACeA,CAAI,GAAK,MAC1B,CAMQ,iBACNC,EACuC,CACvC,GAAK,MAAM,QAAQA,CAAO,EAE1B,OAAOA,EAAQ,IAAKC,GAAiB,CAEnC,GAAI,OAAOA,GAAQ,SACjB,MAAO,CACL,MAAOA,EACP,MAAOA,CACT,EAIF,IAAMC,EAASD,EACf,MAAO,CACL,MAAO,OAAOC,EAAO,OAASA,EAAO,IAAM,EAAE,EAC7C,MAAO,OAAOA,EAAO,OAASA,EAAO,MAAQA,EAAO,OAAS,EAAE,CACjE,CACF,CAAC,CACH,CACF,ECjMO,IAAMC,GAAyB,CAEpC,OAAQ,SACR,WAAY,gBACZ,KAAM,OACN,SAAU,WACV,KAAM,OAGN,SAAU,yBACV,aAAc,qCACd,cAAe,8BACf,UAAW,oCACX,UAAW,mCAGX,QAAS,aACT,QAAS,aACT,eAAgB,iDAChB,MAAO,uBACP,aAAc,+CACd,YAAa,sCACb,SAAU,YAGV,aAAc,aACd,cAAe,cAGf,WAAY,QACZ,UAAW,gBACX,WAAY,+BACd,EChCO,IAAMC,GAA2B,CAEtC,OAAQ,SACR,WAAY,cACZ,KAAM,aACN,SAAU,WACV,KAAM,QAGN,SAAU,iCACV,aAAc,uCACd,cAAe,2CACf,UAAW,uCACX,UAAW,yCAGX,QAAS,gBACT,QAAS,YACT,eAAgB,wCAChB,MAAO,kBACP,aAAc,8CACd,YAAa,+CACb,SAAU,mBAGV,aAAc,oBACd,cAAe,oBAGf,WAAY,SACZ,UAAW,4BACX,WAAY,+BACd,EC1BA,IAAMC,EAAmD,CACvD,GAAAC,GACA,QAASC,GAET,GAAIA,GACJ,QAASA,EACX,EAKMC,GAAiB,KAKvB,SAASC,IAA8B,CACrC,GAAI,OAAO,UAAc,IAAa,OAAOD,GAG7C,IAAME,EACJ,UAAU,UAAa,UAAwC,aAEjE,GAAI,CAACA,EAAa,OAAOF,GAGzB,GAAIH,EAAaK,CAAW,EAC1B,OAAOA,EAIT,IAAMC,EAAeD,EAAY,MAAM,GAAG,EAAE,CAAC,EAC7C,OAAIL,EAAaM,CAAY,EACpBA,EAGFH,EACT,CAKO,SAASI,GAAcC,EAA+B,CAE3D,GAAIA,EAAc,CAEhB,GAAIR,EAAaQ,CAAY,EAC3B,OAAOA,EAGT,IAAMF,EAAeE,EAAa,MAAM,GAAG,EAAE,CAAC,EAC9C,GAAIR,EAAaM,CAAY,EAC3B,OAAOA,CAEX,CAEA,OAAOF,GAAoB,CAC7B,CAKO,SAASK,GACdC,EACAC,EACoB,CAEpB,IAAMC,EAAOZ,EAAaU,CAAM,GAAKV,EAAaG,EAAc,EAGhE,OAAIQ,EACK,CAAE,GAAGC,EAAM,GAAGD,CAAmB,EAGnCC,CACT,CAMO,SAASC,GACdH,EACAC,EAIU,CACV,IAAMG,EAAUL,GAAgBC,EAAQC,CAAkB,EAE1D,MAAO,CACLI,EACAC,IACW,CACX,IAAIC,EAAQH,EAAQC,CAAG,GAAKA,EAG5B,GAAIC,EACF,OAAW,CAACE,EAAaC,CAAW,IAAK,OAAO,QAAQH,CAAY,EAClEC,EAAQA,EAAM,QACZ,IAAI,OAAO,MAAMC,CAAW,MAAO,GAAG,EACtC,OAAOC,CAAW,CACpB,EAIJ,OAAOF,CACT,CACF,CAKO,IAAMG,GAAmB,OAAO,KAAKpB,CAAY,ECzHjD,IAAMqB,EAAU,QC0CvB,IAAMC,GAAqB,mBAEpB,SAASC,GAAK,CACnB,OAAAC,EACA,WAAAC,EACA,WAAAC,EACA,MAAAC,EACA,aAAAC,EAAe,GACf,OAAAC,EAAS,KACT,aAAcC,EACd,UAAAC,EACA,OAAAC,EACA,MAAAC,EAAQ,GACR,QAAAC,EACA,QAAAC,CACF,EAA2B,CACzB,GAAM,CAACC,EAAOC,CAAQ,EAAIC,GAAoB,CAAE,OAAQ,SAAU,CAAC,EAC7D,CAACC,EAASC,CAAU,EAAIF,GAE5B,CAAC,CAAC,EACE,CAACG,EAAQC,CAAS,EAAIJ,GAAiC,CAAC,CAAC,EAGzDK,EAAiBC,GAAQ,IAAMC,GAAchB,CAAM,EAAG,CAACA,CAAM,CAAC,EAC9DiB,EAAIF,GACR,IAAMG,GAAiBJ,EAAgBb,CAAkB,EACzD,CAACa,EAAgBb,CAAkB,CACrC,EAEMkB,EAAM,IAAIC,GAAS,CAAE,QAASxB,EAAY,WAAAC,EAAY,MAAAO,CAAM,CAAC,EAC7DiB,EAAa,GAAG5B,EAAkB,GAAGE,CAAM,GAGjD2B,GAAU,IAAM,CACdC,EAAS,CACX,EAAG,CAAC5B,CAAM,CAAC,EAGX2B,GAAU,IAAM,CACd,GAAI,OAAO,eAAmB,IAC5B,GAAI,CACF,IAAME,EAAQ,eAAe,QAAQH,CAAU,EAC3CG,GACFb,EAAW,KAAK,MAAMa,CAAK,CAAC,CAEhC,MAAQ,CAER,CAEJ,EAAG,CAAC7B,CAAM,CAAC,EAGX2B,GAAU,IAAM,CACd,GACE,OAAO,KAAKZ,CAAO,EAAE,OAAS,GAC9B,OAAO,eAAmB,IAE1B,GAAI,CACF,eAAe,QAAQW,EAAY,KAAK,UAAUX,CAAO,CAAC,CAC5D,MAAQ,CAER,CAEJ,EAAG,CAACA,CAAO,CAAC,EAEZ,eAAea,GAA0B,CACvCf,EAAS,CAAE,OAAQ,SAAU,CAAC,EAC9BH,EAAQ,aAAc,CAAE,OAAAV,CAAO,CAAC,EAEhC,IAAM8B,EAAW,MAAMN,EAAI,cAAcxB,CAAM,EAE/C,GAAI,CAAC8B,EAAS,SAAW,CAACA,EAAS,KAAM,CACvC,IAAMC,EACJD,EAAS,SAAW,GACnBA,EAAS,SAAW,QAAaA,EAAS,QAAU,IACvDjB,EAAS,CACP,OAAQ,QACR,QAASiB,EAAS,OAAS,iBAC3B,UAAWC,CACb,CAAC,EACDrB,EAAQ,aAAc,CACpB,MAAOoB,EAAS,OAAS,iBACzB,UAAWC,CACb,CAAC,EACDrB,EAAQ,QAAS,CACf,KAAM,OACN,QAASoB,EAAS,OAAS,gBAC7B,CAAC,EACD,MACF,CAEAjB,EAAS,CAAE,OAAQ,QAAS,KAAMiB,EAAS,IAAK,CAAC,EACjDpB,EAAQ,eAAgB,CAAE,KAAMoB,EAAS,IAAK,CAAC,CACjD,CAEA,SAASE,EACPC,EACAC,EACM,CAIN,GAHAlB,EAAYmB,IAAU,CAAE,GAAGA,EAAM,CAACF,CAAU,EAAGC,CAAM,EAAE,EAGnDtB,EAAM,SAAW,SAAWA,EAAM,SAAW,aAAc,CAC7D,IAAMwB,EAAWxB,EAAM,KAAK,UAAU,KAAMyB,GAAMA,EAAE,KAAOJ,CAAU,EACjEG,GACF1B,EAAQ,eAAgB,CACtB,WAAAuB,EACA,cAAeG,EAAS,KAC1B,CAAC,CAEL,CAGInB,EAAOgB,CAAU,GACnBf,EAAWiB,GAAS,CAClB,GAAM,CAAE,CAACF,CAAU,EAAGK,EAAG,GAAGC,CAAK,EAAIJ,EACrC,OAAOI,CACT,CAAC,CAEL,CAEA,SAASC,EAAiBP,EAA0B,CAClD,GAAIrB,EAAM,SAAW,SAAWA,EAAM,SAAW,aAAc,CAC7D,IAAMwB,EAAWxB,EAAM,KAAK,UAAU,KAAMyB,GAAMA,EAAE,KAAOJ,CAAU,EACjEG,GACF1B,EAAQ,cAAe,CACrB,WAAAuB,EACA,cAAeG,EAAS,KAC1B,CAAC,CAEL,CACF,CAEA,SAASK,EAAgBR,EAA0B,CACjD,GAAIrB,EAAM,SAAW,SAAWA,EAAM,SAAW,aAAc,CAC7D,IAAMwB,EAAWxB,EAAM,KAAK,UAAU,KAAMyB,GAAMA,EAAE,KAAOJ,CAAU,EACjEG,GACF1B,EAAQ,aAAc,CACpB,WAAAuB,EACA,cAAeG,EAAS,KAC1B,CAAC,CAEL,CACF,CAEA,SAASM,EAAgBC,EAA2B,CAClD,IAAMC,EAAoC,CAAC,EAE3C,QAAWR,KAAYO,EAAK,UAAW,CACrC,IAAME,EAAS9B,EAAQqB,EAAS,EAAE,EAElC,GAAIA,EAAS,WAETS,IAAW,QACXA,IAAW,IACV,MAAM,QAAQA,CAAM,GAAKA,EAAO,SAAW,GAC5C,CACA,IAAMC,EAAexB,EAAE,UAAU,EACjCsB,EAAUR,EAAS,EAAE,EAAIU,EAGzBpC,EAAQ,mBAAoB,CAC1B,WAAY0B,EAAS,GACrB,cAAeA,EAAS,MACxB,MAAOU,CACT,CAAC,CACH,CAEJ,CAEA,OAAA5B,EAAU0B,CAAS,EACZ,OAAO,KAAKA,CAAS,EAAE,SAAW,CAC3C,CAEA,eAAeG,EAAaC,EAAyB,CAGnD,GAFAA,EAAE,eAAe,EAEbpC,EAAM,SAAW,QAAS,OAG9B,GAAI,CAACqC,GAAc,EAAG,CACpB/B,EAAU,CACR,MAAOI,EAAE,aAAa,CACxB,CAAC,EACD,MACF,CAGA,GAAI,CAACoB,EAAgB9B,EAAM,IAAI,EAC7B,OAGFC,EAAS,CAAE,OAAQ,aAAc,KAAMD,EAAM,IAAK,CAAC,EAGnD,IAAMsC,EAAwB,OAAO,QAAQnC,CAAO,EAAE,IACpD,CAAC,CAACkB,EAAYC,CAAK,KAAO,CACxB,WAAAD,EACA,MAAAC,CACF,EACF,EAEAxB,EAAQ,eAAgB,CAAE,QAASwC,CAAY,CAAC,EAEhD,IAAMpB,EAAW,MAAMN,EAAI,eAAexB,EAAQkD,EAAa,CAC7D,WAAY,OAAO,OAAW,IAAc,OAAO,SAAS,SAAW,GACvE,cAAeC,EACf,OAAA9C,EACA,UAAAE,EACA,OAAAC,CACF,CAAC,EAED,GAAI,CAACsB,EAAS,SAAW,CAACA,EAAS,KAAM,CACvC,IAAMsB,EACJtB,EAAS,SAAW,GACnBA,EAAS,SAAW,QAAaA,EAAS,QAAU,IACvDjB,EAAS,CACP,OAAQ,QACR,QAASiB,EAAS,OAAS,oBAC3B,UAAWsB,EACX,KAAMxC,EAAM,IACd,CAAC,EACDF,EAAQ,eAAgB,CACtB,MAAOoB,EAAS,OAAS,oBACzB,UAAWsB,CACb,CAAC,EACD1C,EAAQ,QAAS,CACf,KAAM,SACN,QAASoB,EAAS,OAAS,mBAC7B,CAAC,EACD,MACF,CAGAuB,GAAiB,EAGb,OAAO,eAAmB,KAC5B,eAAe,WAAW3B,CAAU,EAGtCb,EAAS,CAAE,OAAQ,UAAW,WAAYiB,EAAS,KAAK,UAAW,CAAC,EACpEpB,EAAQ,iBAAkB,CAAE,WAAYoB,EAAS,KAAK,UAAW,CAAC,CACpE,CAEA,SAASwB,GAAoB,CACvB1C,EAAM,SAAW,SAAWA,EAAM,KACpCC,EAAS,CAAE,OAAQ,QAAS,KAAMD,EAAM,IAAK,CAAC,EAE9CgB,EAAS,CAEb,CAGA,IAAM2B,GAAapD,EACf,CACE,qBAAsBA,EAAM,aAC5B,wBAAyBA,EAAM,gBAC/B,kBAAmBA,EAAM,UACzB,mBAAoBA,EAAM,WAC1B,qBAAsBA,EAAM,YAC9B,EACA,CAAC,EAEL,OACEqD,EAAC,OACC,UAAU,YACV,MAAOD,GACP,KAAK,SACL,aAAYjC,EAAE,WAAW,EAExB,UAAAV,EAAM,SAAW,WAChB4C,EAACC,GAAA,CAAa,YAAanC,EAAE,SAAS,EAAG,EAG1CV,EAAM,SAAW,SAChB4C,EAACE,GAAA,CACC,KAAM9C,EAAM,KACZ,QAASG,EACT,OAAQE,EACR,eAAgBe,EAChB,aAAcQ,EACd,YAAaC,EACb,SAAUM,EACV,aAAc3C,EACd,WAAYkB,EAAE,QAAQ,EACtB,aAAcA,EAAE,cAAc,EAC9B,cAAeA,EAAE,eAAe,EAClC,EAGDV,EAAM,SAAW,cAChB4C,EAACE,GAAA,CACC,KAAM9C,EAAM,KACZ,QAASG,EACT,OAAQE,EACR,eAAgBe,EAChB,aAAcQ,EACd,YAAaC,EACb,SAAUM,EACV,aAAc3C,EACd,WAAYkB,EAAE,YAAY,EAC1B,aAAcA,EAAE,cAAc,EAC9B,cAAeA,EAAE,eAAe,EAChC,aAAY,GACd,EAGDV,EAAM,SAAW,WAChB4C,EAACG,GAAA,CACC,QAAShD,EACT,aAAcW,EAAE,SAAS,EACzB,eAAgBA,EAAE,gBAAgB,EAClC,UAAWA,EAAE,YAAY,EAC3B,EAGDV,EAAM,SAAW,SAChB4C,EAACI,GAAA,CACC,QAAShD,EAAM,QACf,UAAWA,EAAM,UACjB,QAAS0C,EACT,QAAS3C,EACT,WAAYW,EAAE,OAAO,EACrB,aAAcA,EAAE,UAAU,EAC1B,UAAWA,EAAE,YAAY,EAC3B,GAEJ,CAEJ,CAEA,SAASmC,GAAa,CAAE,YAAAI,CAAY,EAAyC,CAC3E,OACEL,EAAC,OACC,UAAU,aACV,KAAK,SACL,aAAYK,EACZ,YAAU,SAEV,UAAAL,EAAC,OAAI,UAAU,aAAa,cAAY,OAAO,EAC/CA,EAAC,KAAG,SAAAK,EAAY,GAClB,CAEJ,CAoBA,SAASH,GAAY,CACnB,KAAAf,EACA,QAAA5B,EACA,OAAAE,EACA,eAAA6C,EACA,aAAAC,EACA,YAAAC,EACA,SAAAC,EACA,aAAA7D,EACA,WAAA8D,EACA,aAAAC,EACA,cAAAC,EACA,aAAAC,EAAe,EACjB,EAAkC,CAChC,OACEb,EAAC,QAAK,UAAU,UAAU,SAAUS,EAAU,aAAYtB,EAAK,MAC7D,UAAAa,EAAC,OACC,SAAAA,EAAC,MAAG,UAAU,gBAAgB,GAAG,gBAC9B,SAAAb,EAAK,MACR,EACF,EAEC1B,EAAO,OACNuC,EAAC,OAAI,UAAU,mBAAmB,KAAK,QAAQ,YAAU,YACtD,SAAAvC,EAAO,MACV,EAGD0B,EAAK,UAAU,IAAKP,GACnBoB,EAACc,GAAA,CAEC,SAAUlC,EACV,MAAOrB,EAAQqB,EAAS,EAAE,EAC1B,SAAWF,GAAU4B,EAAe1B,EAAS,GAAIF,CAAK,EACtD,QAAS,IAAM6B,EAAa3B,EAAS,EAAE,EACvC,OAAQ,IAAM4B,EAAY5B,EAAS,EAAE,EACrC,MAAOnB,EAAOmB,EAAS,EAAE,EACzB,aAAc+B,EACd,cAAeC,GARVhC,EAAS,EAShB,CACD,EAEDoB,EAAC,OAAI,UAAU,kBACb,SAAAA,EAACe,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,QAASF,EAC9C,SAAAH,EACH,EACF,EAEC9D,GACCoD,EAAC,OAAI,UAAU,cACb,SAAAA,EAAC,KACC,KAAK,wBACL,OAAO,SACP,IAAI,sBACJ,UAAU,mBACX,+BAED,EACF,GAEJ,CAEJ,CAEA,SAASG,GAAa,CACpB,QAAAhD,EACA,aAAA6D,EACA,eAAAC,EACA,UAAAC,CACF,EAKgB,CACd,OACElB,EAAC,OAAI,UAAU,aAAa,KAAK,SAAS,YAAU,SAClD,UAAAA,EAAC,OAAI,UAAU,kBAAkB,cAAY,OAAO,kBAEpD,EACAA,EAAC,MAAG,UAAU,mBAAoB,SAAAgB,EAAa,EAC/ChB,EAAC,KAAE,UAAU,qBACV,SAAAiB,EACH,EACAjB,EAACe,EAAA,CAAO,QAAQ,YAAY,QAAS5D,EAClC,SAAA+D,EACH,GACF,CAEJ,CAEA,SAASd,GAAW,CAClB,QAAAe,EACA,UAAAC,EACA,QAAAC,EACA,QAAAlE,EACA,WAAAmE,EACA,aAAAC,EACA,UAAAL,CACF,EAQgB,CACd,OACElB,EAAC,OAAI,UAAU,WAAW,KAAK,QAAQ,YAAU,YAC/C,UAAAA,EAAC,OAAI,UAAU,gBAAgB,cAAY,OAAO,aAElD,EACAA,EAAC,MAAG,UAAU,iBAAkB,SAAAsB,EAAW,EAC3CtB,EAAC,KAAE,UAAU,gBAAiB,SAAAmB,EAAQ,EACtCnB,EAAC,OAAI,UAAU,kBACZ,UAAAoB,GACCpB,EAACe,EAAA,CAAO,QAAQ,UAAU,QAASM,EAChC,SAAAE,EACH,EAEFvB,EAACe,EAAA,CAAO,QAAQ,YAAY,QAAS5D,EAClC,SAAA+D,EACH,GACF,GACF,CAEJ,CCphBO,IAAMM,GAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["index_exports","__export","GetForty","VERSION","index_default","__toCommonJS","slice","options","vnodeId","isValidElement","rerenderQueue","prevDebounce","defer","depthSort","CAPTURE_REGEX","eventClock","eventProxy","eventProxyCapture","i","EMPTY_OBJ","EMPTY_ARR","IS_NON_DIMENSIONAL","isArray","Array","assign","obj","props","removeNode","node","parentNode","removeChild","createElement","type","children","key","ref","normalizedProps","arguments","length","call","defaultProps","createVNode","original","vnode","__k","__","__b","__e","__c","constructor","__v","__i","__u","Fragment","props","children","BaseComponent","context","this","getDomSibling","vnode","childIndex","__","__i","sibling","__k","length","__e","type","updateParentDomPointers","i","child","__c","base","enqueueRender","c","__d","rerenderQueue","push","process","__r","prevDebounce","options","debounceRendering","defer","component","newVNode","oldVNode","oldDom","commitQueue","refQueue","l","sort","depthSort","shift","__v","__P","assign","diff","__n","namespaceURI","__u","commitRoot","diffChildren","parentDom","renderResult","newParentVNode","oldParentVNode","globalContext","namespace","excessDomChildren","isHydrating","childVNode","newDom","firstChildDom","result","shouldPlace","oldChildren","EMPTY_ARR","newChildrenLength","constructNewChildrenArray","EMPTY_OBJ","ref","applyRef","insert","nextSibling","skewedIndex","matchingIndex","oldChildrenLength","remainingOldChildren","skew","Array","constructor","String","createVNode","isArray","__b","key","findMatchingIndex","unmount","parentVNode","parentNode","insertBefore","nodeType","findMatchingIndex","childVNode","oldChildren","skewedIndex","remainingOldChildren","x","y","childIndex","key","type","oldVNode","matched","__u","length","setStyle","style","value","setProperty","IS_NON_DIMENSIONAL","test","dom","name","oldValue","namespace","useCapture","lowerCaseName","o","cssText","replace","CAPTURE_REGEX","toLowerCase","slice","l","_attached","eventClock","addEventListener","eventProxyCapture","eventProxy","removeEventListener","e","removeAttribute","setAttribute","createEventProxy","this","eventHandler","_dispatched","options","event","diff","parentDom","newVNode","globalContext","excessDomChildren","commitQueue","oldDom","isHydrating","refQueue","tmp","c","isNew","oldProps","oldState","snapshot","clearProcessingException","newProps","isClassComponent","provider","componentContext","i","renderHook","count","renderResult","newType","constructor","__e","__b","outer","props","prototype","render","contextType","__c","__","__E","BaseComponent","doRender","sub","state","__n","__d","__h","_sb","__s","getDerivedStateFromProps","assign","__v","componentWillMount","componentDidMount","push","componentWillReceiveProps","shouldComponentUpdate","__k","some","vnode","componentWillUpdate","componentDidUpdate","context","__P","__r","getChildContext","getSnapshotBeforeUpdate","Fragment","cloneNode","children","diffChildren","isArray","base","then","MODE_HYDRATE","nodeType","nextSibling","indexOf","removeNode","markAsForce","diffElementNodes","diffed","forEach","commitRoot","root","applyRef","cb","call","node","map","newHtml","oldHtml","newChildren","inputValue","checked","EMPTY_OBJ","localName","document","createTextNode","createElementNS","is","__m","data","childNodes","attributes","__html","innerHTML","content","getDomSibling","undefined","ref","hasRefUnmount","current","unmount","parentVNode","skipRemove","r","componentWillUnmount","replaceNode","documentElement","createElement","namespaceURI","firstChild","slice","EMPTY_ARR","options","__e","error","vnode","oldVNode","errorInfo","component","ctor","handled","__","__c","constructor","getDerivedStateFromError","setState","__d","componentDidCatch","__E","e","vnodeId","isValidElement","BaseComponent","prototype","update","callback","s","this","__s","state","assign","props","__v","_sb","push","enqueueRender","forceUpdate","__h","render","Fragment","rerenderQueue","defer","Promise","then","bind","resolve","setTimeout","depthSort","a","b","__b","process","__r","CAPTURE_REGEX","eventClock","eventProxy","createEventProxy","eventProxyCapture","i","EventEmitter","event","callback","eventListeners","data","error","DEFAULT_CONFIG","EventBatcher","flushCallback","config","event","events","eventsToFlush","error","DEFAULT_API_BASE","ApiClient","config","DEFAULT_API_BASE","endpoint","data","url","controller","timeoutId","response","json","error","EventsApi","trackingId","config","ApiClient","event","events","userId","traits","anonymousId","SESSION_STORAGE_KEY","generateSessionId","chars","result","i","getOrCreateSessionId","stored","sessionId","persistSessionId","DEFAULT_CONFIG","calculateBackoffDelay","attempt","config","initialDelay","maxDelay","backoffMultiplier","exponentialDelay","jitter","withRetry","fn","maxRetries","lastError","error","delay","sleep","isRetryableError","status","ms","resolve","THROTTLE_STORAGE_KEY","DEFAULT_THROTTLE_CONFIG","canSubmitForm","lastSubmit","recordSubmission","THROTTLE_STORAGE_KEY","EventRateLimiter","DEFAULT_THROTTLE_CONFIG","windowStart","ts","eventRateLimiter","canTrackEvent","recordEventTracked","Tracker","config","userId","traits","queuedEvents","getOrCreateSessionId","EventsApi","EventBatcher","events","eventName","properties","canTrackEvent","event","recordEventTracked","response","error","withRetry","isRetryableError","stored","DataLayerObserver","config","dataLayer","error","targetWindow","item","index","eventId","self","args","result","obj","event","timestamp","eventName","filter","gtmEvent","properties","key","getfortyEventName","currentIndex","currentComponent","previousComponent","prevRaf","currentHook","afterPaintEffects","options","_options","oldBeforeDiff","__b","oldBeforeRender","__r","oldAfterDiff","diffed","oldCommit","__c","oldBeforeUnmount","unmount","oldRoot","__","getHookState","index","type","__h","hooks","__H","length","push","useState","initialState","useReducer","invokeOrReturn","reducer","init","hookState","_reducer","action","currentValue","__N","nextValue","setState","__f","updateHookState","p","s","c","stateHooks","filter","x","every","prevScu","call","this","shouldUpdate","props","forEach","hookItem","shouldComponentUpdate","prevCWU","componentWillUpdate","__e","tmp","useEffect","callback","args","state","__s","argsChanged","_pendingArgs","useMemo","factory","args","state","getHookState","currentIndex","argsChanged","__H","__","__h","flushAfterPaintEffects","component","afterPaintEffects","shift","__P","__H","__h","forEach","invokeCleanup","invokeEffect","e","options","__e","__v","__b","vnode","currentComponent","oldBeforeDiff","__","parentDom","__k","__m","oldRoot","__r","oldBeforeRender","currentIndex","hooks","__c","previousComponent","hookItem","__N","_pendingArgs","diffed","oldAfterDiff","c","length","push","prevRaf","requestAnimationFrame","afterNextFrame","commitQueue","some","filter","cb","oldCommit","unmount","oldBeforeUnmount","hasErrored","s","HAS_RAF","callback","raf","done","clearTimeout","timeout","cancelAnimationFrame","setTimeout","hook","comp","cleanup","argsChanged","oldArgs","newArgs","arg","index","invokeOrReturn","f","vnodeId","createVNode","type","props","key","isStaticChildren","__source","__self","ref","i","normalizedProps","vnode","__k","__","__b","__e","__c","constructor","__v","vnodeId","__i","__u","defaultProps","options","Button","children","onClick","type","variant","disabled","loading","className","u","Question","question","value","onChange","error","onFocus","onBlur","npsNotLikely","npsVeryLikely","hasError","u","renderInput","NPSInput","RatingInput","TextareaInput","SelectInput","MultiselectInput","TextInput","notLikelyLabel","veryLikelyLabel","_","i","e","options","option","selected","handleToggle","optionValue","v","FormsApi","config","ApiClient","formId","response","data","answers","metadata","answersObj","answer","questionsConfig","q","question","type","options","opt","option","en","ptBR","translations","en","ptBR","DEFAULT_LOCALE","detectBrowserLocale","browserLang","languageOnly","resolveLocale","configLocale","getTranslations","locale","customTranslations","base","createTranslator","strings","key","replacements","value","placeholder","replacement","availableLocales","VERSION","STORAGE_KEY_PREFIX","Form","formId","apiBaseUrl","trackingId","theme","showBranding","locale","customTranslations","sessionId","userId","debug","onEvent","onClose","state","setState","d","answers","setAnswers","errors","setErrors","resolvedLocale","T","resolveLocale","t","createTranslator","api","FormsApi","storageKey","y","loadForm","saved","response","isRetryable","handleAnswerChange","questionId","value","prev","question","q","_","rest","handleFieldFocus","handleFieldBlur","validateAnswers","form","newErrors","answer","errorMessage","handleSubmit","e","canSubmitForm","answersList","VERSION","isSubmitRetryable","recordSubmission","handleRetry","themeStyle","u","LoadingState","FormContent","SuccessState","ErrorState","loadingText","onAnswerChange","onFieldFocus","onFieldBlur","onSubmit","submitText","npsNotLikely","npsVeryLikely","isSubmitting","Question","Button","successTitle","successMessage","closeText","message","retryable","onRetry","errorTitle","tryAgainText","WIDGET_STYLES","DEFAULT_API_BASE","DisplayApi","config","params","queryParams","url","response","error","data","POLL_TIMEOUT_MS","DisplayHandler","config","EventEmitter","flushPromise","userId","formId","f","displaying","event","handler","currentPage","timezone","response","existingIds","newForms","a","b","form","error","TRACKING_ID_PATTERN","isValidTrackingId","trackingId","GetFortyWidget","config","EventEmitter","Tracker","DataLayerObserver","displayApi","DisplayApi","DisplayHandler","data","eventName","properties","flushPromise","userId","traits","formId","event","callback","mode","container","shadowHost","styleElement","WIDGET_STYLES","renderTarget","modalContainer","overlay","e","modalContent","closeButton","target","G","_","Form","reason","widgetSelf","args","createWidget","widget","GetForty","config","createWidget","VERSION","index_default"]}
|