@kupola/kupola 1.2.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.
- package/CHANGELOG.md +130 -0
- package/INTEGRATION.md +440 -0
- package/PROJECT_SUMMARY.md +312 -0
- package/README.md +286 -0
- package/SKILL.md +572 -0
- package/css/accessibility.css +119 -0
- package/css/animations.css +224 -0
- package/css/brand-themes.css +300 -0
- package/css/colors_and_type.css +441 -0
- package/css/components-ext.css +4165 -0
- package/css/components.css +1483 -0
- package/css/kupola.css +12 -0
- package/css/responsive.css +697 -0
- package/css/scaffold.css +145 -0
- package/css/states.css +316 -0
- package/css/theme-dark.css +296 -0
- package/css/theme-light.css +296 -0
- package/css/utilities.css +171 -0
- package/dist/css/kupola.css +12 -0
- package/dist/icons/icons/activity.svg +3 -0
- package/dist/icons/icons/alert-circle.svg +1 -0
- package/dist/icons/icons/alert-triangle.svg +1 -0
- package/dist/icons/icons/alert.d27e24.svg +1 -0
- package/dist/icons/icons/alert.svg +1 -0
- package/dist/icons/icons/apple.svg +1 -0
- package/dist/icons/icons/arrow-down.svg +1 -0
- package/dist/icons/icons/arrow-expand.svg +1 -0
- package/dist/icons/icons/arrow-left.svg +1 -0
- package/dist/icons/icons/arrow-minimize.svg +1 -0
- package/dist/icons/icons/arrow-right-to-line.svg +1 -0
- package/dist/icons/icons/arrow-right.svg +1 -0
- package/dist/icons/icons/arrow-up-right.svg +1 -0
- package/dist/icons/icons/arrow-up.0c0c0d.svg +1 -0
- package/dist/icons/icons/arrow-up.svg +1 -0
- package/dist/icons/icons/at.svg +1 -0
- package/dist/icons/icons/atom.0c0c0d.svg +1 -0
- package/dist/icons/icons/atom.svg +1 -0
- package/dist/icons/icons/bar-chart-2.svg +1 -0
- package/dist/icons/icons/bar.svg +1 -0
- package/dist/icons/icons/bell.svg +1 -0
- package/dist/icons/icons/box.svg +1 -0
- package/dist/icons/icons/bug.svg +1 -0
- package/dist/icons/icons/button.svg +1 -0
- package/dist/icons/icons/calendar.svg +1 -0
- package/dist/icons/icons/check-circle.33c192.svg +1 -0
- package/dist/icons/icons/check-circle.svg +1 -0
- package/dist/icons/icons/check-square.svg +4 -0
- package/dist/icons/icons/check.d1d3db.svg +1 -0
- package/dist/icons/icons/check.svg +1 -0
- package/dist/icons/icons/chevron-down.svg +1 -0
- package/dist/icons/icons/chevron-left.svg +1 -0
- package/dist/icons/icons/chevron-right.svg +1 -0
- package/dist/icons/icons/chevron-up.svg +1 -0
- package/dist/icons/icons/circle.svg +1 -0
- package/dist/icons/icons/clock.svg +1 -0
- package/dist/icons/icons/cmd.svg +1 -0
- package/dist/icons/icons/code.svg +1 -0
- package/dist/icons/icons/columns.svg +1 -0
- package/dist/icons/icons/copy.svg +1 -0
- package/dist/icons/icons/cpu.svg +1 -0
- package/dist/icons/icons/dashboard.0c0c0d.svg +1 -0
- package/dist/icons/icons/dashboard.svg +1 -0
- package/dist/icons/icons/dollar.svg +1 -0
- package/dist/icons/icons/download.svg +1 -0
- package/dist/icons/icons/edit.svg +1 -0
- package/dist/icons/icons/extensions.svg +1 -0
- package/dist/icons/icons/external.svg +1 -0
- package/dist/icons/icons/eye.svg +1 -0
- package/dist/icons/icons/file-text.svg +1 -0
- package/dist/icons/icons/file.svg +1 -0
- package/dist/icons/icons/files.svg +1 -0
- package/dist/icons/icons/filter.svg +1 -0
- package/dist/icons/icons/folder-open.svg +4 -0
- package/dist/icons/icons/folder.svg +1 -0
- package/dist/icons/icons/gear.svg +1 -0
- package/dist/icons/icons/git.svg +1 -0
- package/dist/icons/icons/github.svg +1 -0
- package/dist/icons/icons/globe.svg +1 -0
- package/dist/icons/icons/grid-2x2.svg +1 -0
- package/dist/icons/icons/hash.svg +1 -0
- package/dist/icons/icons/heart.svg +1 -0
- package/dist/icons/icons/help-circle.svg +5 -0
- package/dist/icons/icons/help.svg +1 -0
- package/dist/icons/icons/home.svg +1 -0
- package/dist/icons/icons/icons.svg +153 -0
- package/dist/icons/icons/image.svg +1 -0
- package/dist/icons/icons/info-circle.svg +1 -0
- package/dist/icons/icons/info-square.svg +1 -0
- package/dist/icons/icons/info.387bff.svg +1 -0
- package/dist/icons/icons/info.svg +1 -0
- package/dist/icons/icons/input.svg +1 -0
- package/dist/icons/icons/key.svg +1 -0
- package/dist/icons/icons/layers.svg +1 -0
- package/dist/icons/icons/layout-grid.svg +6 -0
- package/dist/icons/icons/layout.svg +1 -0
- package/dist/icons/icons/link.svg +1 -0
- package/dist/icons/icons/list.svg +1 -0
- package/dist/icons/icons/lock.svg +1 -0
- package/dist/icons/icons/log-out.svg +1 -0
- package/dist/icons/icons/logo.svg +1 -0
- package/dist/icons/icons/mail.svg +1 -0
- package/dist/icons/icons/menu.svg +1 -0
- package/dist/icons/icons/message-circle.svg +1 -0
- package/dist/icons/icons/message-plus.svg +1 -0
- package/dist/icons/icons/message-square.svg +1 -0
- package/dist/icons/icons/mic.svg +1 -0
- package/dist/icons/icons/minus.svg +1 -0
- package/dist/icons/icons/moon.svg +1 -0
- package/dist/icons/icons/more-h.svg +1 -0
- package/dist/icons/icons/mouse.svg +1 -0
- package/dist/icons/icons/palette.svg +1 -0
- package/dist/icons/icons/panel-bottom.svg +1 -0
- package/dist/icons/icons/pause.svg +1 -0
- package/dist/icons/icons/play.svg +1 -0
- package/dist/icons/icons/plug.svg +1 -0
- package/dist/icons/icons/plus.0c0c0d.svg +1 -0
- package/dist/icons/icons/plus.svg +1 -0
- package/dist/icons/icons/refresh.svg +1 -0
- package/dist/icons/icons/ruler.svg +1 -0
- package/dist/icons/icons/scroll-text.svg +1 -0
- package/dist/icons/icons/search-menu.svg +1 -0
- package/dist/icons/icons/search.svg +1 -0
- package/dist/icons/icons/send.0c0c0d.svg +1 -0
- package/dist/icons/icons/send.svg +1 -0
- package/dist/icons/icons/settings.0c0c0d.svg +1 -0
- package/dist/icons/icons/settings.svg +1 -0
- package/dist/icons/icons/shield.svg +1 -0
- package/dist/icons/icons/sidebar-left.svg +1 -0
- package/dist/icons/icons/sidebar-right.svg +1 -0
- package/dist/icons/icons/sliders.svg +1 -0
- package/dist/icons/icons/sparkles.32f08c.svg +1 -0
- package/dist/icons/icons/sparkles.svg +1 -0
- package/dist/icons/icons/square.svg +1 -0
- package/dist/icons/icons/star.svg +1 -0
- package/dist/icons/icons/sun.svg +1 -0
- package/dist/icons/icons/table.svg +1 -0
- package/dist/icons/icons/terminal.svg +1 -0
- package/dist/icons/icons/trash.svg +1 -0
- package/dist/icons/icons/trending-down.svg +1 -0
- package/dist/icons/icons/trending-up.svg +1 -0
- package/dist/icons/icons/type.svg +1 -0
- package/dist/icons/icons/upload.svg +1 -0
- package/dist/icons/icons/user-circle.svg +1 -0
- package/dist/icons/icons/user-plus.svg +6 -0
- package/dist/icons/icons/user.svg +1 -0
- package/dist/icons/icons/users.svg +1 -0
- package/dist/icons/icons/warning.svg +1 -0
- package/dist/icons/icons/wrench.svg +1 -0
- package/dist/icons/icons/x-circle.svg +1 -0
- package/dist/icons/icons/x.svg +1 -0
- package/dist/icons/icons/zap.0c0c0d.svg +1 -0
- package/dist/icons/icons/zap.svg +1 -0
- package/dist/kupola.cjs.js +258 -0
- package/dist/kupola.cjs.js.map +1 -0
- package/dist/kupola.esm.js +7640 -0
- package/dist/kupola.esm.js.map +1 -0
- package/dist/kupola.umd.js +258 -0
- package/dist/kupola.umd.js.map +1 -0
- package/dist/types/kupola.d.ts +1359 -0
- package/dist/utils/utils/Kupola.cs +77 -0
- package/dist/utils/utils/Kupola.java +104 -0
- package/dist/utils/utils/kupola.go +120 -0
- package/dist/utils/utils/kupola.js +63 -0
- package/dist/utils/utils/kupola.py +1392 -0
- package/dist/utils/utils/kupola.rb +69 -0
- package/icons/activity.svg +3 -0
- package/icons/alert-circle.svg +1 -0
- package/icons/alert-triangle.svg +1 -0
- package/icons/alert.d27e24.svg +1 -0
- package/icons/alert.svg +1 -0
- package/icons/apple.svg +1 -0
- package/icons/arrow-down.svg +1 -0
- package/icons/arrow-expand.svg +1 -0
- package/icons/arrow-left.svg +1 -0
- package/icons/arrow-minimize.svg +1 -0
- package/icons/arrow-right-to-line.svg +1 -0
- package/icons/arrow-right.svg +1 -0
- package/icons/arrow-up-right.svg +1 -0
- package/icons/arrow-up.0c0c0d.svg +1 -0
- package/icons/arrow-up.svg +1 -0
- package/icons/at.svg +1 -0
- package/icons/atom.0c0c0d.svg +1 -0
- package/icons/atom.svg +1 -0
- package/icons/bar-chart-2.svg +1 -0
- package/icons/bar.svg +1 -0
- package/icons/bell.svg +1 -0
- package/icons/box.svg +1 -0
- package/icons/bug.svg +1 -0
- package/icons/button.svg +1 -0
- package/icons/calendar.svg +1 -0
- package/icons/check-circle.33c192.svg +1 -0
- package/icons/check-circle.svg +1 -0
- package/icons/check-square.svg +4 -0
- package/icons/check.d1d3db.svg +1 -0
- package/icons/check.svg +1 -0
- package/icons/chevron-down.svg +1 -0
- package/icons/chevron-left.svg +1 -0
- package/icons/chevron-right.svg +1 -0
- package/icons/chevron-up.svg +1 -0
- package/icons/circle.svg +1 -0
- package/icons/clock.svg +1 -0
- package/icons/cmd.svg +1 -0
- package/icons/code.svg +1 -0
- package/icons/columns.svg +1 -0
- package/icons/copy.svg +1 -0
- package/icons/cpu.svg +1 -0
- package/icons/dashboard.0c0c0d.svg +1 -0
- package/icons/dashboard.svg +1 -0
- package/icons/dollar.svg +1 -0
- package/icons/download.svg +1 -0
- package/icons/edit.svg +1 -0
- package/icons/extensions.svg +1 -0
- package/icons/external.svg +1 -0
- package/icons/eye.svg +1 -0
- package/icons/file-text.svg +1 -0
- package/icons/file.svg +1 -0
- package/icons/files.svg +1 -0
- package/icons/filter.svg +1 -0
- package/icons/folder-open.svg +4 -0
- package/icons/folder.svg +1 -0
- package/icons/gear.svg +1 -0
- package/icons/git.svg +1 -0
- package/icons/github.svg +1 -0
- package/icons/globe.svg +1 -0
- package/icons/grid-2x2.svg +1 -0
- package/icons/hash.svg +1 -0
- package/icons/heart.svg +1 -0
- package/icons/help-circle.svg +5 -0
- package/icons/help.svg +1 -0
- package/icons/home.svg +1 -0
- package/icons/icons.svg +153 -0
- package/icons/image.svg +1 -0
- package/icons/info-circle.svg +1 -0
- package/icons/info-square.svg +1 -0
- package/icons/info.387bff.svg +1 -0
- package/icons/info.svg +1 -0
- package/icons/input.svg +1 -0
- package/icons/key.svg +1 -0
- package/icons/layers.svg +1 -0
- package/icons/layout-grid.svg +6 -0
- package/icons/layout.svg +1 -0
- package/icons/link.svg +1 -0
- package/icons/list.svg +1 -0
- package/icons/lock.svg +1 -0
- package/icons/log-out.svg +1 -0
- package/icons/logo.svg +1 -0
- package/icons/mail.svg +1 -0
- package/icons/menu.svg +1 -0
- package/icons/message-circle.svg +1 -0
- package/icons/message-plus.svg +1 -0
- package/icons/message-square.svg +1 -0
- package/icons/mic.svg +1 -0
- package/icons/minus.svg +1 -0
- package/icons/moon.svg +1 -0
- package/icons/more-h.svg +1 -0
- package/icons/mouse.svg +1 -0
- package/icons/palette.svg +1 -0
- package/icons/panel-bottom.svg +1 -0
- package/icons/pause.svg +1 -0
- package/icons/play.svg +1 -0
- package/icons/plug.svg +1 -0
- package/icons/plus.0c0c0d.svg +1 -0
- package/icons/plus.svg +1 -0
- package/icons/refresh.svg +1 -0
- package/icons/ruler.svg +1 -0
- package/icons/scroll-text.svg +1 -0
- package/icons/search-menu.svg +1 -0
- package/icons/search.svg +1 -0
- package/icons/send.0c0c0d.svg +1 -0
- package/icons/send.svg +1 -0
- package/icons/settings.0c0c0d.svg +1 -0
- package/icons/settings.svg +1 -0
- package/icons/shield.svg +1 -0
- package/icons/sidebar-left.svg +1 -0
- package/icons/sidebar-right.svg +1 -0
- package/icons/sliders.svg +1 -0
- package/icons/sparkles.32f08c.svg +1 -0
- package/icons/sparkles.svg +1 -0
- package/icons/square.svg +1 -0
- package/icons/star.svg +1 -0
- package/icons/sun.svg +1 -0
- package/icons/table.svg +1 -0
- package/icons/terminal.svg +1 -0
- package/icons/trash.svg +1 -0
- package/icons/trending-down.svg +1 -0
- package/icons/trending-up.svg +1 -0
- package/icons/type.svg +1 -0
- package/icons/upload.svg +1 -0
- package/icons/user-circle.svg +1 -0
- package/icons/user-plus.svg +6 -0
- package/icons/user.svg +1 -0
- package/icons/users.svg +1 -0
- package/icons/warning.svg +1 -0
- package/icons/wrench.svg +1 -0
- package/icons/x-circle.svg +1 -0
- package/icons/x.svg +1 -0
- package/icons/zap.0c0c0d.svg +1 -0
- package/icons/zap.svg +1 -0
- package/js/calendar.js +184 -0
- package/js/carousel.js +173 -0
- package/js/collapse.js +127 -0
- package/js/color-picker.js +144 -0
- package/js/component.js +276 -0
- package/js/composition-api.js +458 -0
- package/js/countdown.js +144 -0
- package/js/data-bind.js +1286 -0
- package/js/datepicker.js +270 -0
- package/js/dialog.js +131 -0
- package/js/drawer.js +118 -0
- package/js/dropdown.js +122 -0
- package/js/dynamic-tags.js +156 -0
- package/js/error-handler.js +181 -0
- package/js/fileupload.js +392 -0
- package/js/form.js +291 -0
- package/js/global-events.js +203 -0
- package/js/heatmap.js +405 -0
- package/js/http.js +419 -0
- package/js/i18n.js +228 -0
- package/js/icons.js +165 -0
- package/js/image-preview.js +218 -0
- package/js/initializer.js +162 -0
- package/js/kupola-core.js +66 -0
- package/js/kupola-devtools.js +598 -0
- package/js/kupola-lifecycle.js +510 -0
- package/js/message.js +60 -0
- package/js/modal.js +191 -0
- package/js/notification.js +73 -0
- package/js/numberinput.js +146 -0
- package/js/performance.js +250 -0
- package/js/registry.js +205 -0
- package/js/router.js +396 -0
- package/js/security.js +189 -0
- package/js/select.js +143 -0
- package/js/slide-captcha.js +504 -0
- package/js/slider.js +94 -0
- package/js/statcard.js +219 -0
- package/js/tag.js +83 -0
- package/js/test-utils.js +251 -0
- package/js/theme.js +363 -0
- package/js/timepicker.js +238 -0
- package/js/tooltip.js +122 -0
- package/js/utils.js +1458 -0
- package/js/validation.js +553 -0
- package/js/virtual-list.js +593 -0
- package/package.json +105 -0
- package/templates/base.html +30 -0
- package/templates/base_dashboard.html +99 -0
- package/types/kupola.d.ts +1359 -0
- package/utils/Kupola.cs +77 -0
- package/utils/Kupola.java +104 -0
- package/utils/kupola.go +120 -0
- package/utils/kupola.js +63 -0
- package/utils/kupola.py +1392 -0
- package/utils/kupola.rb +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kupola.umd.js","sources":["../js/component.js","../js/registry.js","../js/router.js","../js/http.js","../js/initializer.js","../js/kupola-core.js","../js/kupola-lifecycle.js","../js/utils.js","../js/data-bind.js","../js/theme.js","../js/dropdown.js","../js/select.js","../js/datepicker.js","../js/timepicker.js","../js/slider.js","../js/carousel.js","../js/drawer.js","../js/modal.js","../js/dialog.js","../js/fileupload.js","../js/collapse.js","../js/color-picker.js","../js/calendar.js","../js/dynamic-tags.js","../js/image-preview.js","../js/tag.js","../js/statcard.js","../js/heatmap.js","../js/tooltip.js","../js/validation.js","../js/virtual-list.js","../js/kupola-devtools.js","../js/icons.js","../js/countdown.js","../js/numberinput.js","../js/slide-captcha.js","../js/composition-api.js","../js/form.js","../js/test-utils.js","../js/i18n.js","../js/global-events.js","../js/security.js","../js/error-handler.js","../js/performance.js","../src/index.js"],"sourcesContent":["class KupolaComponent {\r\n constructor(element) {\r\n this.element = element;\r\n this.isMounted = false;\r\n this.isDestroyed = false;\r\n this.props = this._parseProps();\r\n this.state = {};\r\n this.slots = this._parseSlots();\r\n this._eventListeners = {};\r\n this._appliedMixins = [];\r\n this.lifecycle = window.KupolaLifecycle \r\n ? new window.KupolaLifecycle()\r\n : {\r\n on: () => () => {},\r\n emit: () => {},\r\n bootstrap: () => {},\r\n mount: () => {},\r\n update: () => {},\r\n unmount: () => {},\r\n destroy: () => {},\r\n state: 'created'\r\n };\r\n this.setupContext = null;\r\n }\r\n\r\n _parseProps() {\r\n const props = {};\r\n for (const attr of this.element.attributes) {\r\n if (attr.name.startsWith('data-prop-')) {\r\n const name = attr.name.replace('data-prop-', '');\r\n let value = attr.value;\r\n try {\r\n value = JSON.parse(value);\r\n } catch (e) {}\r\n props[name] = value;\r\n }\r\n }\r\n return props;\r\n }\r\n\r\n _parseSlots() {\r\n const slots = {};\r\n const slotElements = this.element.querySelectorAll('[data-slot]');\r\n \r\n slotElements.forEach(slotEl => {\r\n const slotName = slotEl.getAttribute('data-slot') || 'default';\r\n slots[slotName] = slotEl.innerHTML.trim();\r\n slotEl.remove();\r\n });\r\n \r\n if (!slots.default && this.element.children.length > 0) {\r\n slots.default = this.element.innerHTML.trim();\r\n }\r\n \r\n return slots;\r\n }\r\n\r\n $slot(name = 'default') {\r\n return this.slots[name] || '';\r\n }\r\n\r\n $emit(eventName, data) {\r\n const handlers = this._eventListeners[eventName] || [];\r\n handlers.forEach(handler => {\r\n try {\r\n handler(data);\r\n } catch (e) {\r\n console.error(`Error in event handler for ${eventName}:`, e);\r\n }\r\n });\r\n \r\n if (this.element) {\r\n const customEvent = new CustomEvent(`kupola:${eventName}`, {\r\n detail: data,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n this.element.dispatchEvent(customEvent);\r\n }\r\n }\r\n\r\n $on(eventName, handler) {\r\n if (!this._eventListeners[eventName]) {\r\n this._eventListeners[eventName] = [];\r\n }\r\n this._eventListeners[eventName].push(handler);\r\n return handler;\r\n }\r\n\r\n $off(eventName, handler) {\r\n if (this._eventListeners[eventName]) {\r\n this._eventListeners[eventName] = this._eventListeners[eventName].filter(cb => cb !== handler);\r\n }\r\n }\r\n\r\n async setProps(newProps) {\r\n try {\r\n this.props = { ...this.props, ...newProps };\r\n await this.lifecycle.update();\r\n this.setupContext?._executeUpdated();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error in setProps for \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'update', hook: 'setProps', error, args: [newProps] });\r\n }\r\n }\r\n }\r\n\r\n async setState(newState) {\r\n try {\r\n this.state = { ...this.state, ...newState };\r\n await this.lifecycle.update();\r\n this.setupContext?._executeUpdated();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error in setState for \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'update', hook: 'setState', error, args: [newState] });\r\n }\r\n }\r\n }\r\n\r\n async mount() {\r\n if (this.isMounted || this.isDestroyed) return;\r\n\r\n try {\r\n this._bindLifecycleHooks();\r\n\r\n await this.lifecycle.bootstrap();\r\n\r\n if (window._setCurrentSetupContext && window.SetupContext) {\r\n this.setupContext = new window.SetupContext(this);\r\n window._setCurrentSetupContext(this.setupContext);\r\n \r\n if (typeof this.setup === 'function') {\r\n const result = this.setup();\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n }\r\n }\r\n\r\n this.isMounted = true;\r\n await this.lifecycle.mount();\r\n\r\n this.setupContext?._executeMounted();\r\n \r\n if (window._clearSetupContext) {\r\n window._clearSetupContext();\r\n }\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error mounting component \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'mount', hook: 'component', error, args: [] });\r\n }\r\n \r\n if (typeof this.renderError === 'function') {\r\n try {\r\n this.renderError(error);\r\n } catch (e) {\r\n console.error(`[KupolaComponent] Error in renderError for \"${this.constructor.name}\":`, e);\r\n }\r\n } else {\r\n this.element.innerHTML = `\r\n <div style=\"padding: 16px; background: #fee2e2; border: 1px solid #fecaca; border-radius: 8px; color: #991b1b;\">\r\n <div style=\"font-weight: bold; margin-bottom: 8px;\">Component Error</div>\r\n <div style=\"font-size: 12px; white-space: pre-wrap;\">${error.message}</div>\r\n </div>\r\n `;\r\n }\r\n }\r\n }\r\n\r\n _bindLifecycleHooks() {\r\n if (this._hooksBound) return;\r\n \r\n const hookMap = {\r\n beforeMount: 'beforeMount',\r\n render: ['mount', 'update'],\r\n afterMount: 'afterMount',\r\n updated: 'afterUpdate',\r\n beforeUnmount: 'beforeUnmount',\r\n afterUnmount: 'afterUnmount',\r\n renderError: 'errorBoundary'\r\n };\r\n \r\n let proto = Object.getPrototypeOf(this);\r\n const registeredHooks = new Set();\r\n \r\n while (proto && proto.constructor !== Object && proto.constructor !== KupolaComponent) {\r\n for (const [methodName, lifecyclePhase] of Object.entries(hookMap)) {\r\n if (registeredHooks.has(methodName)) continue;\r\n \r\n if (proto.hasOwnProperty(methodName)) {\r\n if (Array.isArray(lifecyclePhase)) {\r\n lifecyclePhase.forEach(phase => {\r\n if (methodName === 'render') {\r\n this.lifecycle.on(phase, () => this.render?.());\r\n }\r\n });\r\n } else if (methodName === 'renderError') {\r\n this.lifecycle.on(lifecyclePhase, (errorInfo) => {\r\n this.renderError(errorInfo.error);\r\n return 'handled';\r\n });\r\n } else {\r\n this.lifecycle.on(lifecyclePhase, () => this[methodName]?.());\r\n }\r\n registeredHooks.add(methodName);\r\n }\r\n }\r\n proto = Object.getPrototypeOf(proto);\r\n }\r\n \r\n this._hooksBound = true;\r\n }\r\n\r\n async unmount() {\r\n if (!this.isMounted || this.isDestroyed) return;\r\n\r\n try {\r\n this.setupContext?._executeUnmounted();\r\n \r\n await this.lifecycle.unmount();\r\n this.isMounted = false;\r\n this.isDestroyed = true;\r\n await this.lifecycle.destroy();\r\n } catch (error) {\r\n console.error(`[KupolaComponent] Error unmounting component \"${this.constructor.name}\":`, error);\r\n \r\n if (this.lifecycle && typeof this.lifecycle._handleError === 'function') {\r\n await this.lifecycle._handleError({ phase: 'unmount', hook: 'component', error, args: [] });\r\n }\r\n \r\n this.isMounted = false;\r\n this.isDestroyed = true;\r\n }\r\n }\r\n\r\n beforeMount() {}\r\n afterMount() {}\r\n beforeUnmount() {}\r\n afterUnmount() {}\r\n render() {}\r\n renderError(error) {}\r\n updated() {}\r\n setup() {}\r\n}\r\n\r\nfunction applyMixin(componentClass, mixin) {\r\n Object.keys(mixin).forEach(key => {\r\n if (key === 'constructor') return;\r\n if (typeof mixin[key] === 'function') {\r\n const original = componentClass.prototype[key];\r\n if (original) {\r\n componentClass.prototype[key] = function(...args) {\r\n mixin[key].apply(this, args);\r\n return original.apply(this, args);\r\n };\r\n } else {\r\n componentClass.prototype[key] = mixin[key];\r\n }\r\n } else {\r\n componentClass.prototype[key] = mixin[key];\r\n }\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaComponent, applyMixin };\r\n} else {\r\n window.KupolaComponent = KupolaComponent;\r\n window.applyMixin = applyMixin;\r\n}","class KupolaComponentRegistry {\r\n constructor() {\r\n this.components = new Map();\r\n this.lazyComponents = new Map();\r\n this.loadedComponents = new Map();\r\n this.instances = new Map();\r\n this.observer = null;\r\n this.mixins = new Map();\r\n this.loadingPromises = new Map();\r\n }\r\n\r\n register(name, componentClass) {\r\n if (!(componentClass.prototype instanceof window.KupolaComponent)) {\r\n throw new Error(`Component ${name} must extend KupolaComponent`);\r\n }\r\n this.components.set(name, componentClass);\r\n }\r\n\r\n registerLazy(name, loader) {\r\n this.lazyComponents.set(name, loader);\r\n }\r\n\r\n unregister(name) {\r\n this.components.delete(name);\r\n this.lazyComponents.delete(name);\r\n this.loadedComponents.delete(name);\r\n this.loadingPromises.delete(name);\r\n }\r\n\r\n get(name) {\r\n return this.components.get(name) || this.loadedComponents.get(name);\r\n }\r\n\r\n async getAsync(name) {\r\n const cached = this.components.get(name) || this.loadedComponents.get(name);\r\n if (cached) return cached;\r\n\r\n if (this.loadingPromises.has(name)) {\r\n return this.loadingPromises.get(name);\r\n }\r\n\r\n const loader = this.lazyComponents.get(name);\r\n if (!loader) {\r\n throw new Error(`Component ${name} not found`);\r\n }\r\n\r\n const loadingPromise = (async () => {\r\n try {\r\n const result = await loader();\r\n const componentClass = result.default || result;\r\n if (!(componentClass.prototype instanceof window.KupolaComponent)) {\r\n throw new Error(`Component ${name} must extend KupolaComponent`);\r\n }\r\n this.loadedComponents.set(name, componentClass);\r\n return componentClass;\r\n } catch (e) {\r\n this.loadingPromises.delete(name);\r\n throw e;\r\n }\r\n })();\r\n\r\n this.loadingPromises.set(name, loadingPromise);\r\n return loadingPromise;\r\n }\r\n\r\n defineMixin(name, mixin) {\r\n this.mixins.set(name, mixin);\r\n }\r\n\r\n useMixin(componentClass, ...mixinNames) {\r\n mixinNames.forEach(name => {\r\n const mixin = this.mixins.get(name);\r\n if (mixin && window.applyMixin) {\r\n window.applyMixin(componentClass, mixin);\r\n }\r\n });\r\n }\r\n\r\n async bootstrap(root = document) {\r\n await this._upgradeElements(root);\r\n this._startObserver(root);\r\n }\r\n\r\n async _upgradeElements(root) {\r\n const elements = root.querySelectorAll('[data-component]');\r\n const promises = [];\r\n elements.forEach(element => {\r\n promises.push(this._upgradeElement(element));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n async _upgradeElement(element) {\r\n if (element.__kupolaInstance || element.__kupolaUpgrading) return;\r\n \r\n element.__kupolaUpgrading = true;\r\n \r\n try {\r\n const componentName = element.getAttribute('data-component');\r\n \r\n if (window.kupolaInitializer && componentName) {\r\n const initializer = window.kupolaInitializer.get(componentName);\r\n if (initializer) {\r\n try {\r\n await initializer(element);\r\n return;\r\n } catch (e) {\r\n console.warn(`[KupolaComponentRegistry] Initializer for \"${componentName}\" failed, trying component class:`, e);\r\n }\r\n }\r\n }\r\n \r\n let ComponentClass = this.components.get(componentName);\r\n \r\n if (!ComponentClass) {\r\n try {\r\n ComponentClass = await this.getAsync(componentName);\r\n } catch (e) {\r\n console.error(`Failed to load component ${componentName}:`, e);\r\n return;\r\n }\r\n \r\n if (!element.isConnected) {\r\n return;\r\n }\r\n }\r\n \r\n const mixinNames = element.getAttribute('data-mixins');\r\n const componentClass = ComponentClass;\r\n if (mixinNames && window.applyMixin) {\r\n mixinNames.split(',').forEach(name => {\r\n const mixin = this.mixins.get(name.trim());\r\n if (mixin) {\r\n window.applyMixin(componentClass, mixin);\r\n }\r\n });\r\n }\r\n \r\n const instance = new componentClass(element);\r\n element.__kupolaInstance = instance;\r\n this.instances.set(element, instance);\r\n instance.mount();\r\n } finally {\r\n element.__kupolaUpgrading = false;\r\n }\r\n }\r\n\r\n _startObserver(root) {\r\n if (this.observer) return;\r\n \r\n this.observer = new MutationObserver((mutations) => {\r\n mutations.forEach(mutation => {\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n if (node.hasAttribute('data-component')) {\r\n this._upgradeElement(node).catch(e => console.error(e));\r\n }\r\n this._upgradeElements(node).catch(e => console.error(e));\r\n }\r\n });\r\n \r\n mutation.removedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const instance = this.instances.get(node);\r\n if (instance) {\r\n instance.unmount();\r\n this.instances.delete(node);\r\n }\r\n node.querySelectorAll('[data-component]').forEach(child => {\r\n const childInstance = this.instances.get(child);\r\n if (childInstance) {\r\n childInstance.unmount();\r\n this.instances.delete(child);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.observer.observe(root, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n this.instances.forEach(instance => {\r\n instance.unmount();\r\n });\r\n this.instances.clear();\r\n this.components.clear();\r\n this.mixins.clear();\r\n }\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaComponentRegistry };\r\n} else {\r\n window.KupolaComponentRegistry = KupolaComponentRegistry;\r\n}","class KupolaRouter {\r\n constructor(options = {}) {\r\n this.mode = options.mode || 'hash';\r\n this.routes = options.routes || [];\r\n this.base = options.base || '';\r\n this.currentRoute = null;\r\n this.beforeEachHandlers = [];\r\n this.afterEachHandlers = [];\r\n this.isStarted = false;\r\n this.animationClass = 'fade';\r\n this.componentCache = new Map();\r\n this._routeHandler = () => this._handleRoute();\r\n \r\n this._setupRoutes();\r\n this._bindEvents();\r\n }\r\n\r\n _setupRoutes() {\r\n this.routeMap = new Map();\r\n this._registerRoutes(this.routes, '');\r\n }\r\n\r\n _registerRoutes(routes, parentPath) {\r\n routes.forEach(route => {\r\n const fullPath = route.path.startsWith('/') \r\n ? route.path \r\n : parentPath + (parentPath && !route.path.startsWith('/') ? '/' : '') + route.path;\r\n const pathRegex = this._pathToRegex(fullPath);\r\n this.routeMap.set(fullPath, { ...route, regex: pathRegex, parentPath });\r\n \r\n if (route.children && route.children.length > 0) {\r\n this._registerRoutes(route.children, fullPath);\r\n }\r\n });\r\n }\r\n\r\n _pathToRegex(path) {\r\n const regexStr = path\r\n .replace(/:(\\w+)/g, '([^/]+)')\r\n .replace(/\\*/g, '.*');\r\n return new RegExp(`^${regexStr}$`);\r\n }\r\n\r\n _bindEvents() {\r\n if (this.mode === 'hash') {\r\n window.addEventListener('hashchange', this._routeHandler);\r\n } else {\r\n window.addEventListener('popstate', this._routeHandler);\r\n }\r\n }\r\n\r\n _handleRoute() {\r\n const path = this._getCurrentPath();\r\n this.navigate(path);\r\n }\r\n\r\n _getCurrentPath() {\r\n if (this.mode === 'hash') {\r\n return location.hash.slice(1) || '/';\r\n }\r\n return location.pathname.replace(this.base, '') || '/';\r\n }\r\n\r\n async navigate(path, replace = false) {\r\n const route = this._matchRoute(path);\r\n if (!route) return;\r\n\r\n const from = this.currentRoute;\r\n \r\n for (const handler of this.beforeEachHandlers) {\r\n const result = await handler(route, from);\r\n if (result === false) return;\r\n }\r\n\r\n this.currentRoute = route;\r\n this._updateURL(path, replace);\r\n await this._renderRoute(route);\r\n\r\n for (const handler of this.afterEachHandlers) {\r\n handler(route);\r\n }\r\n }\r\n\r\n _matchRoute(path) {\r\n for (const [, route] of this.routeMap) {\r\n const match = path.match(route.regex);\r\n if (match) {\r\n const params = {};\r\n const paramNames = route.path.match(/:(\\w+)/g) || [];\r\n paramNames.forEach((name, index) => {\r\n params[name.slice(1)] = match[index + 1];\r\n });\r\n \r\n const query = this._parseQuery();\r\n \r\n return {\r\n ...route,\r\n params,\r\n query,\r\n fullPath: path\r\n };\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n _parseQuery() {\r\n const search = location.search.slice(1);\r\n const params = {};\r\n if (search) {\r\n search.split('&').forEach(pair => {\r\n const [key, value] = pair.split('=');\r\n params[key] = decodeURIComponent(value || '');\r\n });\r\n }\r\n return params;\r\n }\r\n\r\n _updateURL(path, replace) {\r\n if (this.mode === 'hash') {\r\n const url = `#${path}`;\r\n if (replace) {\r\n location.replace(url);\r\n } else {\r\n location.hash = path;\r\n }\r\n } else {\r\n const url = this.base + path + location.search;\r\n if (replace) {\r\n history.replaceState({}, '', url);\r\n } else {\r\n history.pushState({}, '', url);\r\n }\r\n }\r\n }\r\n\r\n async _renderRoute(route) {\r\n if (route.parentPath && route.parentPath !== '') {\r\n await this._renderNestedRoute(route);\r\n } else {\r\n await this._renderRootRoute(route);\r\n }\r\n }\r\n\r\n async _renderRootRoute(route) {\r\n const container = document.querySelector('[data-router-view]');\r\n if (!container || !route.component) return;\r\n \r\n this._cleanupContainerComponents(container);\r\n \r\n container.classList.add('router-view-leave');\r\n container.classList.remove('router-view-enter');\r\n \r\n await this._waitForAnimation(container);\r\n \r\n const componentName = await this._resolveComponent(route.component);\r\n if (!componentName) return;\r\n \r\n const componentElement = document.createElement('div');\r\n componentElement.setAttribute('data-component', componentName);\r\n componentElement.classList.add('router-view-enter');\r\n \r\n Object.keys(route.params).forEach(key => {\r\n componentElement.setAttribute(`data-prop-${key}`, route.params[key]);\r\n });\r\n \r\n container.innerHTML = '';\r\n container.appendChild(componentElement);\r\n \r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap(container);\r\n }\r\n \r\n setTimeout(() => {\r\n container.classList.remove('router-view-leave');\r\n componentElement.classList.remove('router-view-enter');\r\n }, 10);\r\n }\r\n\r\n async _renderNestedRoute(route) {\r\n const parentRoute = this.routeMap.get(route.parentPath);\r\n if (!parentRoute) return;\r\n \r\n const rootContainer = document.querySelector('[data-router-view]');\r\n if (!rootContainer) return;\r\n \r\n const existingParent = document.querySelector(`[data-component=\"${parentRoute.component}\"]`);\r\n \r\n if (!existingParent) {\r\n this._cleanupContainerComponents(rootContainer);\r\n \r\n rootContainer.classList.add('router-view-leave');\r\n rootContainer.classList.remove('router-view-enter');\r\n \r\n await this._waitForAnimation(rootContainer);\r\n \r\n const parentName = await this._resolveComponent(parentRoute.component);\r\n if (!parentName) return;\r\n \r\n const parentElement = document.createElement('div');\r\n parentElement.setAttribute('data-component', parentName);\r\n \r\n rootContainer.innerHTML = '';\r\n rootContainer.appendChild(parentElement);\r\n \r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap(rootContainer);\r\n }\r\n \r\n setTimeout(() => {\r\n rootContainer.classList.remove('router-view-leave');\r\n }, 50);\r\n \r\n await this._renderChildComponent(route);\r\n } else {\r\n await this._renderChildComponent(route);\r\n }\r\n }\r\n\r\n async _renderChildComponent(route) {\r\n const parentElement = document.querySelector(`[data-component=\"${this._getParentComponent(route.parentPath)}\"]`);\r\n if (!parentElement) return;\r\n \r\n const container = parentElement.querySelector('[data-router-view]');\r\n if (!container || !route.component) return;\r\n \r\n const componentName = await this._resolveComponent(route.component);\r\n if (!componentName) return;\r\n \r\n const componentElement = document.createElement('div');\r\n componentElement.setAttribute('data-component', componentName);\r\n componentElement.classList.add('router-view-enter');\r\n \r\n Object.keys(route.params).forEach(key => {\r\n componentElement.setAttribute(`data-prop-${key}`, route.params[key]);\r\n });\r\n \r\n container.innerHTML = '';\r\n container.appendChild(componentElement);\r\n \r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap(container);\r\n }\r\n \r\n setTimeout(() => {\r\n componentElement.classList.remove('router-view-enter');\r\n }, 10);\r\n }\r\n\r\n async _resolveComponent(component) {\r\n if (typeof component === 'function') {\r\n const cacheKey = component.toString();\r\n if (this.componentCache.has(cacheKey)) {\r\n return this.componentCache.get(cacheKey);\r\n }\r\n \r\n try {\r\n const result = await component();\r\n const componentClass = result.default || result;\r\n \r\n const componentName = `lazy-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.register(componentName, componentClass);\r\n }\r\n \r\n this.componentCache.set(cacheKey, componentName);\r\n return componentName;\r\n } catch (e) {\r\n console.error('Failed to load lazy component:', e);\r\n return null;\r\n }\r\n }\r\n \r\n if (typeof component === 'string' && component.startsWith('lazy:')) {\r\n const componentName = component.slice(5);\r\n if (window.kupolaRegistry) {\r\n try {\r\n await window.kupolaRegistry.getAsync(componentName);\r\n } catch (e) {\r\n console.error(`Failed to load lazy component ${componentName}:`, e);\r\n return null;\r\n }\r\n }\r\n return componentName;\r\n }\r\n \r\n return component;\r\n }\r\n\r\n _getParentComponent(parentPath) {\r\n for (const [path, route] of this.routeMap) {\r\n if (path === parentPath) {\r\n return route.component;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n setAnimation(name) {\r\n this.animationClass = name;\r\n }\r\n\r\n push(path) {\r\n this.navigate(path, false);\r\n }\r\n\r\n replace(path) {\r\n this.navigate(path, true);\r\n }\r\n\r\n go(delta) {\r\n history.go(delta);\r\n }\r\n\r\n back() {\r\n history.back();\r\n }\r\n\r\n forward() {\r\n history.forward();\r\n }\r\n\r\n beforeEach(handler) {\r\n this.beforeEachHandlers.push(handler);\r\n }\r\n\r\n afterEach(handler) {\r\n this.afterEachHandlers.push(handler);\r\n }\r\n\r\n _waitForAnimation(element) {\r\n return new Promise(resolve => {\r\n const transitionDuration = this._getTransitionDuration(element);\r\n if (transitionDuration > 0) {\r\n const cleanup = () => {\r\n element.removeEventListener('transitionend', cleanup);\r\n element.removeEventListener('animationend', cleanup);\r\n resolve();\r\n };\r\n element.addEventListener('transitionend', cleanup);\r\n element.addEventListener('animationend', cleanup);\r\n setTimeout(cleanup, transitionDuration + 100);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n _getTransitionDuration(element) {\r\n const style = window.getComputedStyle(element);\r\n const transitionDuration = parseFloat(style.transitionDuration) || 0;\r\n const animationDuration = parseFloat(style.animationDuration) || 0;\r\n return Math.max(transitionDuration, animationDuration) * 1000;\r\n }\r\n\r\n _cleanupContainerComponents(container) {\r\n const components = container.querySelectorAll('[data-component]');\r\n components.forEach(element => {\r\n const instance = element.__kupolaInstance;\r\n if (instance && typeof instance.unmount === 'function') {\r\n instance.unmount().catch(e => console.error(`Error unmounting component:`, e));\r\n }\r\n });\r\n \r\n if (window.kupolaInitializer) {\r\n const allElements = container.querySelectorAll('[data-component], [data-dropdown], [data-select], [data-datepicker], [data-timepicker], [data-slider], [data-carousel], [data-drawer], [data-modal], [data-dialog], [data-color-picker], [data-calendar], [data-slide-captcha], [data-heatmap]');\r\n allElements.forEach(element => {\r\n window.kupolaInitializer.cleanup(element);\r\n });\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this.mode === 'hash') {\r\n window.removeEventListener('hashchange', this._routeHandler);\r\n } else {\r\n window.removeEventListener('popstate', this._routeHandler);\r\n }\r\n this.routes = [];\r\n this.routeMap.clear();\r\n this.beforeEachHandlers = [];\r\n this.afterEachHandlers = [];\r\n }\r\n}\r\n\r\nfunction createRouter(options) {\r\n return new KupolaRouter(options);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaRouter, createRouter };\r\n} else {\r\n window.KupolaRouter = KupolaRouter;\r\n window.createRouter = createRouter;\r\n}","class KupolaHttp {\r\n constructor(options = {}) {\r\n this.baseURL = options.baseURL || '';\r\n this.timeout = options.timeout || 30000;\r\n this.headers = options.headers || {};\r\n this.cache = new Map();\r\n this.cacheTTL = options.cacheTTL || 60000;\r\n this.maxRetries = options.maxRetries || 0;\r\n this.retryDelay = options.retryDelay || 1000;\r\n this.activeRequests = new Map();\r\n this.withCredentials = options.withCredentials || false;\r\n\r\n this._useAxios = typeof axios !== 'undefined';\r\n if (this._useAxios) {\r\n this._initAxios(options);\r\n }\r\n \r\n if (options.interceptors) {\r\n this.interceptors = options.interceptors;\r\n }\r\n }\r\n\r\n _initAxios(options) {\r\n this.axios = axios.create({\r\n baseURL: this.baseURL,\r\n timeout: this.timeout,\r\n headers: this.headers\r\n });\r\n \r\n this.axios.defaults.withCredentials = options.withCredentials || false;\r\n }\r\n\r\n _generateCacheKey(config) {\r\n const { url, method = 'GET', params = {}, data = null } = config;\r\n const query = params ? new URLSearchParams(params).toString() : '';\r\n const dataKey = data ? JSON.stringify(data) : '';\r\n return `${method}:${url}:${query}:${dataKey}`;\r\n }\r\n\r\n _getCache(key) {\r\n const cached = this.cache.get(key);\r\n if (cached && Date.now() - cached.timestamp < this.cacheTTL) {\r\n return cached.data;\r\n }\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n\r\n _setCache(key, data) {\r\n this.cache.set(key, { data, timestamp: Date.now() });\r\n }\r\n\r\n async _requestWithRetry(config, retryCount = 0) {\r\n try {\r\n return await this._request(config);\r\n } catch (error) {\r\n if (retryCount < this.maxRetries) {\r\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * Math.pow(2, retryCount)));\r\n return this._requestWithRetry(config, retryCount + 1);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async _request(config) {\r\n const { \r\n url, \r\n method = 'GET', \r\n headers = {}, \r\n params = {}, \r\n data = null, \r\n timeout = this.timeout,\r\n cache = false\r\n } = config;\r\n\r\n const cacheKey = this._generateCacheKey({ url, method, params, data });\r\n \r\n if (cache && method === 'GET') {\r\n const cached = this._getCache(cacheKey);\r\n if (cached) {\r\n return cached;\r\n }\r\n }\r\n\r\n const controller = new AbortController();\r\n this.activeRequests.set(cacheKey, controller);\r\n\r\n const requestHeaders = { ...this.headers, ...headers };\r\n \r\n if (!requestHeaders['Content-Type'] && data && !(data instanceof FormData)) {\r\n requestHeaders['Content-Type'] = 'application/json';\r\n }\r\n\r\n let requestConfig = {\r\n url: this.baseURL ? new URL(url, this.baseURL).toString() : url,\r\n method,\r\n headers: requestHeaders,\r\n signal: controller.signal,\r\n credentials: this.withCredentials ? 'include' : 'same-origin'\r\n };\r\n\r\n if (Object.keys(params).length > 0) {\r\n const urlObj = new URL(requestConfig.url);\r\n Object.keys(params).forEach(key => {\r\n urlObj.searchParams.append(key, params[key]);\r\n });\r\n requestConfig.url = urlObj.toString();\r\n }\r\n\r\n if (data !== null) {\r\n requestConfig.body = data instanceof FormData ? data : JSON.stringify(data);\r\n }\r\n\r\n if (this.interceptors && this.interceptors.request) {\r\n try {\r\n const intercepted = await this.interceptors.request(requestConfig);\r\n if (intercepted) requestConfig = intercepted;\r\n } catch (error) {\r\n this.activeRequests.delete(cacheKey);\r\n if (this.interceptors.requestError) {\r\n return this.interceptors.requestError(error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n try {\r\n let response;\r\n if (this._useAxios) {\r\n const axiosConfig = {\r\n url: requestConfig.url.replace(this.baseURL, ''),\r\n method: requestConfig.method,\r\n headers: requestConfig.headers,\r\n signal: requestConfig.signal,\r\n timeout\r\n };\r\n if (data !== null) axiosConfig.data = data;\r\n if (params && Object.keys(params).length > 0) axiosConfig.params = params;\r\n \r\n response = await this.axios(axiosConfig);\r\n } else {\r\n response = await this._fetchWithTimeout(requestConfig, timeout);\r\n \r\n if (!response.ok) {\r\n const error = new Error(`HTTP error! status: ${response.status}`);\r\n error.status = response.status;\r\n error.statusText = response.statusText;\r\n throw error;\r\n }\r\n }\r\n \r\n const result = {\r\n data: this._useAxios ? response.data : await this._parseResponse(response),\r\n status: this._useAxios ? response.status : response.status,\r\n statusText: this._useAxios ? response.statusText : response.statusText,\r\n headers: this._useAxios ? response.headers : this._parseHeaders(response.headers),\r\n config: requestConfig\r\n };\r\n \r\n if (this.interceptors && this.interceptors.response) {\r\n return this.interceptors.response(result);\r\n }\r\n \r\n if (cache && method === 'GET') {\r\n this._setCache(cacheKey, result);\r\n }\r\n \r\n return result;\r\n } catch (error) {\r\n if (error.name === 'AbortError' || (this._useAxios && error.code === 'ERR_CANCELED')) {\r\n return null;\r\n }\r\n if (this.interceptors && this.interceptors.responseError) {\r\n return this.interceptors.responseError(error);\r\n }\r\n throw error;\r\n } finally {\r\n this.activeRequests.delete(cacheKey);\r\n }\r\n }\r\n\r\n async _fetchWithTimeout(config, timeout) {\r\n const controller = new AbortController();\r\n const signal = controller.signal;\r\n \r\n const timeoutPromise = new Promise((_, reject) => {\r\n const timerId = setTimeout(() => {\r\n controller.abort();\r\n reject(new Error('Request timeout'));\r\n }, timeout);\r\n \r\n signal.addEventListener('abort', () => {\r\n clearTimeout(timerId);\r\n });\r\n });\r\n \r\n const fetchPromise = fetch({ ...config, signal });\r\n \r\n return Promise.race([fetchPromise, timeoutPromise]);\r\n }\r\n\r\n async _parseResponse(response) {\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.includes('application/json')) {\r\n return response.json();\r\n }\r\n return response.text();\r\n }\r\n\r\n _parseHeaders(headers) {\r\n const result = {};\r\n headers.forEach((value, key) => {\r\n result[key] = value;\r\n });\r\n return result;\r\n }\r\n\r\n cancelRequest(url, params = {}, method = 'GET', data = null) {\r\n const cacheKey = this._generateCacheKey({ url, method, params, data });\r\n if (this.activeRequests.has(cacheKey)) {\r\n this.activeRequests.get(cacheKey).abort();\r\n this.activeRequests.delete(cacheKey);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n cancelAllRequests() {\r\n this.activeRequests.forEach((controller) => {\r\n controller.abort();\r\n });\r\n this.activeRequests.clear();\r\n }\r\n\r\n clearCache() {\r\n this.cache.clear();\r\n }\r\n\r\n clearCacheByUrl(url) {\r\n this.cache.forEach((_, key) => {\r\n if (key.startsWith(`GET:${url}`)) {\r\n this.cache.delete(key);\r\n }\r\n });\r\n }\r\n\r\n get(url, config = {}) {\r\n const useCache = config.cache ?? true;\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n \r\n const requestConfig = { ...config, url, method: 'GET', cache: useCache };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n post(url, data = null, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'POST', data, cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n async uploadFile(url, file, options = {}) {\r\n const {\r\n chunkSize = 2 * 1024 * 1024,\r\n onProgress,\r\n headers = {},\r\n parallel = false\r\n } = options;\r\n\r\n const totalChunks = Math.ceil(file.size / chunkSize);\r\n let uploadedChunks = 0;\r\n let progress = 0;\r\n\r\n const fileId = this._generateFileId(file);\r\n\r\n if (parallel) {\r\n const promises = [];\r\n for (let i = 0; i < totalChunks; i++) {\r\n const promise = this._uploadChunk(url, file, i, totalChunks, chunkSize, fileId, headers)\r\n .then(() => {\r\n uploadedChunks++;\r\n progress = Math.round((uploadedChunks / totalChunks) * 100);\r\n \r\n if (onProgress) {\r\n onProgress({\r\n progress,\r\n uploaded: uploadedChunks * chunkSize,\r\n total: file.size,\r\n currentChunk: uploadedChunks,\r\n totalChunks\r\n });\r\n }\r\n });\r\n promises.push(promise);\r\n }\r\n await Promise.all(promises);\r\n return this._completeUpload(url, fileId, totalChunks, file.name);\r\n }\r\n\r\n for (let i = 0; i < totalChunks; i++) {\r\n await this._uploadChunk(url, file, i, totalChunks, chunkSize, fileId, headers);\r\n \r\n uploadedChunks++;\r\n progress = Math.round((uploadedChunks / totalChunks) * 100);\r\n \r\n if (onProgress) {\r\n onProgress({\r\n progress,\r\n uploaded: uploadedChunks * chunkSize,\r\n total: file.size,\r\n currentChunk: i + 1,\r\n totalChunks\r\n });\r\n }\r\n }\r\n\r\n return this._completeUpload(url, fileId, totalChunks, file.name);\r\n }\r\n\r\n async _uploadChunk(url, file, chunkIndex, totalChunks, chunkSize, fileId, headers) {\r\n const start = chunkIndex * chunkSize;\r\n const end = Math.min(start + chunkSize, file.size);\r\n const chunk = file.slice(start, end);\r\n\r\n const formData = new FormData();\r\n formData.append('chunk', chunk);\r\n formData.append('chunkIndex', chunkIndex);\r\n formData.append('totalChunks', totalChunks);\r\n formData.append('fileId', fileId);\r\n formData.append('fileName', file.name);\r\n formData.append('fileSize', file.size);\r\n\r\n return this.post(`${url}/chunk`, formData, { headers });\r\n }\r\n\r\n async _completeUpload(url, fileId, totalChunks, fileName) {\r\n return this.post(`${url}/complete`, { fileId, totalChunks, fileName });\r\n }\r\n\r\n _generateFileId(file) {\r\n const hash = `${file.name}-${file.size}-${file.lastModified}`;\r\n let result = 0;\r\n for (let i = 0; i < hash.length; i++) {\r\n result = ((result << 5) - result) + hash.charCodeAt(i);\r\n result |= 0;\r\n }\r\n return Math.abs(result).toString(36) + Date.now().toString(36);\r\n }\r\n\r\n put(url, data = null, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'PUT', data, cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n delete(url, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'DELETE', cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n patch(url, data = null, config = {}) {\r\n const useRetry = config.retry ?? this.maxRetries > 0;\r\n const requestConfig = { ...config, url, method: 'PATCH', data, cache: false };\r\n \r\n if (useRetry) {\r\n return this._requestWithRetry(requestConfig);\r\n }\r\n return this._request(requestConfig);\r\n }\r\n\r\n setHeader(name, value) {\r\n this.headers[name] = value;\r\n if (this.axios) {\r\n this.axios.defaults.headers.common[name] = value;\r\n }\r\n }\r\n\r\n setToken(token, type = 'Bearer') {\r\n this.headers['Authorization'] = `${type} ${token}`;\r\n if (this.axios) {\r\n this.axios.defaults.headers.common['Authorization'] = `${type} ${token}`;\r\n }\r\n }\r\n\r\n setCacheTTL(ttl) {\r\n this.cacheTTL = ttl;\r\n }\r\n\r\n setMaxRetries(retries) {\r\n this.maxRetries = retries;\r\n }\r\n}\r\n\r\nfunction createHttp(options) {\r\n return new KupolaHttp(options);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { KupolaHttp, createHttp };\r\n} else {\r\n window.KupolaHttp = KupolaHttp;\r\n window.createHttp = createHttp;\r\n}","class ComponentInitializerRegistry {\r\n constructor() {\r\n this.initializers = new Map();\r\n this.cleanupFunctions = new Map();\r\n this.processedElements = new WeakSet();\r\n }\r\n\r\n register(name, initFn, cleanupFn = null) {\r\n this.initializers.set(name, initFn);\r\n if (cleanupFn) {\r\n this.cleanupFunctions.set(name, cleanupFn);\r\n }\r\n }\r\n\r\n unregister(name) {\r\n this.initializers.delete(name);\r\n this.cleanupFunctions.delete(name);\r\n }\r\n\r\n has(name) {\r\n return this.initializers.has(name);\r\n }\r\n\r\n get(name) {\r\n return this.initializers.get(name);\r\n }\r\n\r\n async initialize(element) {\r\n if (this.processedElements.has(element)) return;\r\n\r\n const dataAttrs = ['data-component', 'data-dropdown', 'data-select', 'data-datepicker', \r\n 'data-timepicker', 'data-slider', 'data-carousel', 'data-drawer', \r\n 'data-modal', 'data-dialog', 'data-color-picker', 'data-calendar',\r\n 'data-slide-captcha', 'data-heatmap'];\r\n\r\n for (const attr of dataAttrs) {\r\n const value = element.getAttribute(attr);\r\n if (value) {\r\n const name = value || attr.replace('data-', '');\r\n const initFn = this.initializers.get(name) || this.initializers.get(attr.replace('data-', ''));\r\n \r\n if (initFn) {\r\n try {\r\n await initFn(element);\r\n this.processedElements.add(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error initializing \"${name}\":`, error);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const className = element.className;\r\n const classSelectors = [\r\n '.ds-dropdown', '.ds-select', '.ds-datepicker', '.ds-timepicker', \r\n '.ds-slider', '.ds-carousel', '.ds-drawer', '.ds-modal', '.ds-dialog',\r\n '.ds-color-picker', '.ds-calendar', '.ds-slider-captcha', '.ds-heatmap',\r\n '.ds-tooltip', '.ds-tag', '.ds-statcard', '.ds-collapse', '.ds-fileupload',\r\n '.ds-notification', '.ds-message'\r\n ];\r\n\r\n for (const selector of classSelectors) {\r\n const classNamePart = selector.replace('.', '');\r\n if (className.includes(classNamePart)) {\r\n const name = classNamePart.replace('ds-', '');\r\n const initFn = this.initializers.get(name) || this.initializers.get(classNamePart);\r\n \r\n if (initFn) {\r\n try {\r\n await initFn(element);\r\n this.processedElements.add(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error initializing \"${name}\":`, error);\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n cleanup(element) {\r\n const dataAttrs = ['data-component', 'data-dropdown', 'data-select', 'data-datepicker', \r\n 'data-timepicker', 'data-slider', 'data-carousel', 'data-drawer', \r\n 'data-modal', 'data-dialog', 'data-color-picker', 'data-calendar',\r\n 'data-slide-captcha', 'data-heatmap'];\r\n\r\n for (const attr of dataAttrs) {\r\n const value = element.getAttribute(attr);\r\n if (value) {\r\n const name = value || attr.replace('data-', '');\r\n const cleanupFn = this.cleanupFunctions.get(name) || this.cleanupFunctions.get(attr.replace('data-', ''));\r\n \r\n if (cleanupFn) {\r\n try {\r\n cleanupFn(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error cleaning up \"${name}\":`, error);\r\n }\r\n this.processedElements.delete(element);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const className = element.className;\r\n const classSelectors = [\r\n '.ds-dropdown', '.ds-select', '.ds-datepicker', '.ds-timepicker', \r\n '.ds-slider', '.ds-carousel', '.ds-drawer', '.ds-modal', '.ds-dialog',\r\n '.ds-color-picker', '.ds-calendar', '.ds-slider-captcha', '.ds-heatmap',\r\n '.ds-tooltip', '.ds-tag', '.ds-statcard', '.ds-collapse', '.ds-fileupload',\r\n '.ds-notification', '.ds-message'\r\n ];\r\n\r\n for (const selector of classSelectors) {\r\n const classNamePart = selector.replace('.', '');\r\n if (className.includes(classNamePart)) {\r\n const name = classNamePart.replace('ds-', '');\r\n const cleanupFn = this.cleanupFunctions.get(name) || this.cleanupFunctions.get(classNamePart);\r\n \r\n if (cleanupFn) {\r\n try {\r\n cleanupFn(element);\r\n } catch (error) {\r\n console.error(`[ComponentInitializerRegistry] Error cleaning up \"${name}\":`, error);\r\n }\r\n this.processedElements.delete(element);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n async initializeAll(root = document) {\r\n const elements = root.querySelectorAll('[data-component], [data-dropdown], [data-select], ' +\r\n '[data-datepicker], [data-timepicker], [data-slider], [data-carousel], ' +\r\n '[data-drawer], [data-modal], [data-dialog], [data-color-picker], ' +\r\n '[data-calendar], [data-slide-captcha], [data-heatmap], ' +\r\n '.ds-dropdown, .ds-select, .ds-datepicker, .ds-timepicker, ' +\r\n '.ds-slider, .ds-carousel, .ds-drawer, .ds-modal, .ds-dialog, ' +\r\n '.ds-color-picker, .ds-calendar, .ds-slider-captcha, .ds-heatmap, ' +\r\n '.ds-tooltip, .ds-tag, .ds-statcard, .ds-collapse, .ds-fileupload, ' +\r\n '.ds-notification, .ds-message');\r\n\r\n const promises = [];\r\n elements.forEach(element => {\r\n if (!this.processedElements.has(element)) {\r\n promises.push(this.initialize(element));\r\n }\r\n });\r\n await Promise.all(promises);\r\n }\r\n}\r\n\r\nconst kupolaInitializer = new ComponentInitializerRegistry();\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { ComponentInitializerRegistry, kupolaInitializer };\r\n} else {\r\n window.ComponentInitializerRegistry = ComponentInitializerRegistry;\r\n window.kupolaInitializer = kupolaInitializer;\r\n}","if (typeof window === 'undefined') {\r\n const { KupolaComponent, applyMixin } = require('./component.js');\r\n const { KupolaComponentRegistry } = require('./registry.js');\r\n const { KupolaRouter, createRouter } = require('./router.js');\r\n const { KupolaHttp, createHttp } = require('./http.js');\r\n \r\n module.exports = {\r\n KupolaComponent,\r\n applyMixin,\r\n KupolaComponentRegistry,\r\n KupolaRouter,\r\n KupolaHttp,\r\n createRouter,\r\n createHttp\r\n };\r\n}\r\n\r\nif (window.KupolaComponentRegistry) {\r\n window.kupolaRegistry = new window.KupolaComponentRegistry();\r\n}\r\n\r\nasync function kupolaBootstrap() {\r\n if (window.kupolaData) {\r\n window.kupolaData.loadPersisted();\r\n }\r\n if (window.kupolaRegistry) {\r\n await window.kupolaRegistry.bootstrap();\r\n }\r\n}\r\n\r\nif (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', kupolaBootstrap);\r\n} else {\r\n setTimeout(kupolaBootstrap, 0);\r\n}\r\n\r\nwindow.registerComponent = function(name, componentClass) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.register(name, componentClass);\r\n }\r\n};\r\n\r\nwindow.registerLazyComponent = function(name, loader) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.registerLazy(name, loader);\r\n }\r\n};\r\n\r\nwindow.bootstrapComponents = function(root) {\r\n if (window.kupolaRegistry) {\r\n return window.kupolaRegistry.bootstrap(root);\r\n }\r\n return Promise.resolve();\r\n};\r\n\r\nwindow.defineMixin = function(name, mixin) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.defineMixin(name, mixin);\r\n }\r\n};\r\n\r\nwindow.useMixin = function(componentClass, ...mixinNames) {\r\n if (window.kupolaRegistry) {\r\n window.kupolaRegistry.useMixin(componentClass, ...mixinNames);\r\n }\r\n};","class KupolaLifecycle {\r\n constructor(scope = 'app') {\r\n this.scope = scope;\r\n this.hooks = new Map();\r\n this.state = 'created';\r\n this.stateHistory = ['created'];\r\n this.transitions = new Map([\r\n ['created', ['bootstrapped', 'destroyed']],\r\n ['bootstrapped', ['mounted', 'destroyed']],\r\n ['mounted', ['updated', 'unmounted', 'destroyed']],\r\n ['updated', ['updated', 'unmounted', 'destroyed']],\r\n ['unmounted', ['mounted', 'destroyed']],\r\n ['destroyed', []]\r\n ]);\r\n \r\n this.phaseStateMap = {\r\n 'bootstrap': { from: 'created', to: 'bootstrapped' },\r\n 'mount': { from: ['bootstrapped', 'unmounted'], to: 'mounted' },\r\n 'update': { from: ['mounted', 'updated'], to: 'updated' },\r\n 'unmount': { from: ['mounted', 'updated'], to: 'unmounted' },\r\n 'destroy': { from: ['bootstrapped', 'mounted', 'updated', 'unmounted'], to: 'destroyed' }\r\n };\r\n\r\n this.basePhases = ['bootstrap', 'mount', 'update', 'unmount', 'destroy'];\r\n this.allPhases = ['error', 'errorBoundary'];\r\n \r\n this.basePhases.forEach(phase => {\r\n this.allPhases.push(`before${phase.charAt(0).toUpperCase() + phase.slice(1)}`);\r\n this.allPhases.push(phase);\r\n this.allPhases.push(`after${phase.charAt(0).toUpperCase() + phase.slice(1)}`);\r\n });\r\n \r\n this.allPhases.forEach(phase => {\r\n this.hooks.set(phase, []);\r\n });\r\n \r\n this.pendingHooks = new Set();\r\n this.trace = [];\r\n this.errorHandler = null;\r\n this.errorBoundary = null;\r\n this.lastError = null;\r\n this.errorCount = 0;\r\n this.maxErrors = 10;\r\n this._onErrorCallback = null;\r\n }\r\n\r\n _validateTransition(nextState) {\r\n const allowed = this.transitions.get(this.state);\r\n if (!allowed || !allowed.includes(nextState)) {\r\n throw new Error(`Invalid state transition: ${this.state} -> ${nextState}`);\r\n }\r\n return true;\r\n }\r\n\r\n _updateState(nextState) {\r\n this._validateTransition(nextState);\r\n this.state = nextState;\r\n this.stateHistory.push(nextState);\r\n }\r\n\r\n _resetResolved(phase) {\r\n const handlers = this.hooks.get(phase);\r\n if (handlers) {\r\n handlers.forEach(hook => {\r\n hook.resolved = false;\r\n });\r\n }\r\n }\r\n\r\n on(phase, handler, options = {}) {\r\n if (!this.allPhases.includes(phase)) {\r\n throw new Error(`Unknown lifecycle phase: ${phase}`);\r\n }\r\n \r\n const hooks = this.hooks.get(phase);\r\n hooks.push({\r\n handler,\r\n priority: options.priority || 0,\r\n depends: options.depends || [],\r\n name: options.name || handler.name || `anonymous_${hooks.length}`\r\n });\r\n \r\n hooks.sort((a, b) => b.priority - a.priority);\r\n \r\n return () => {\r\n const index = hooks.findIndex(h => h.handler === handler);\r\n if (index > -1) {\r\n hooks.splice(index, 1);\r\n }\r\n };\r\n }\r\n\r\n async _resolveDepends(depends, phase) {\r\n if (!depends || depends.length === 0) return;\r\n \r\n for (const depName of depends) {\r\n const phaseHooks = this.hooks.get(phase);\r\n const depHook = phaseHooks.find(h => h.name === depName);\r\n if (depHook && !depHook.resolved) {\r\n await depHook.handler();\r\n depHook.resolved = true;\r\n }\r\n }\r\n }\r\n\r\n async emit(phase, ...args) {\r\n if (this.state === 'destroyed' && phase !== 'error') return;\r\n \r\n const handlers = this.hooks.get(phase);\r\n if (!handlers || handlers.length === 0) return;\r\n\r\n const emitId = `${phase}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n this.pendingHooks.add(emitId);\r\n\r\n const startTime = performance.now();\r\n \r\n try {\r\n for (const hook of handlers) {\r\n await this._resolveDepends(hook.depends, phase);\r\n \r\n const hookStartTime = performance.now();\r\n let hookResult, hookError;\r\n \r\n try {\r\n hookResult = hook.handler(...args);\r\n if (hookResult instanceof Promise) {\r\n await hookResult;\r\n }\r\n hook.resolved = true;\r\n } catch (error) {\r\n hookError = error;\r\n console.error(`[KupolaLifecycle] Error in ${phase} hook \"${hook.name}\":`, error);\r\n \r\n if (phase !== 'error') {\r\n await this._handleError({ phase, hook: hook.name, error, args });\r\n }\r\n }\r\n \r\n const hookDuration = performance.now() - hookStartTime;\r\n \r\n this.trace.push({\r\n emitId,\r\n phase,\r\n hookName: hook.name,\r\n duration: hookDuration,\r\n status: hookError ? 'error' : 'success',\r\n error: hookError ? hookError.message : null,\r\n timestamp: Date.now()\r\n });\r\n }\r\n \r\n const totalDuration = performance.now() - startTime;\r\n console.debug(`[KupolaLifecycle] ${phase} completed in ${totalDuration.toFixed(2)}ms (${this.scope})`);\r\n } finally {\r\n this.pendingHooks.delete(emitId);\r\n }\r\n }\r\n\r\n async runPhase(phase, ...args) {\r\n if (!this.basePhases.includes(phase)) {\r\n throw new Error(`Unknown base phase: ${phase}`);\r\n }\r\n\r\n const stateMap = this.phaseStateMap[phase];\r\n if (stateMap) {\r\n if (Array.isArray(stateMap.from)) {\r\n if (!stateMap.from.includes(this.state)) {\r\n throw new Error(`Cannot ${phase} from state ${this.state}, expected one of: ${stateMap.from.join(', ')}`);\r\n }\r\n } else {\r\n if (this.state !== stateMap.from) {\r\n throw new Error(`Cannot ${phase} from state ${this.state}, expected ${stateMap.from}`);\r\n }\r\n }\r\n }\r\n\r\n const beforePhase = `before${phase.charAt(0).toUpperCase() + phase.slice(1)}`;\r\n const afterPhase = `after${phase.charAt(0).toUpperCase() + phase.slice(1)}`;\r\n \r\n this._resetResolved(beforePhase);\r\n this._resetResolved(phase);\r\n this._resetResolved(afterPhase);\r\n\r\n if (this.allPhases.includes(beforePhase)) {\r\n await this.emit(beforePhase, ...args);\r\n }\r\n\r\n await this.emit(phase, ...args);\r\n\r\n if (stateMap) {\r\n this._updateState(stateMap.to);\r\n }\r\n\r\n if (this.allPhases.includes(afterPhase)) {\r\n await this.emit(afterPhase, ...args);\r\n }\r\n }\r\n\r\n async bootstrap(...args) {\r\n await this.runPhase('bootstrap', ...args);\r\n }\r\n\r\n async _waitForDOMReady() {\r\n return new Promise((resolve) => {\r\n if (document.readyState === 'complete' || document.readyState === 'interactive') {\r\n resolve();\r\n return;\r\n }\r\n \r\n const onReady = () => {\r\n document.removeEventListener('DOMContentLoaded', onReady);\r\n window.removeEventListener('load', onReady);\r\n resolve();\r\n };\r\n \r\n document.addEventListener('DOMContentLoaded', onReady);\r\n window.addEventListener('load', onReady);\r\n });\r\n }\r\n\r\n async mount(...args) {\r\n await this.runPhase('mount', ...args);\r\n }\r\n\r\n async mountWithDOMReady(...args) {\r\n await this._waitForDOMReady();\r\n await this.runPhase('mount', ...args);\r\n }\r\n\r\n async update(...args) {\r\n await this.runPhase('update', ...args);\r\n }\r\n\r\n async unmount(...args) {\r\n await this.runPhase('unmount', ...args);\r\n }\r\n\r\n async destroy(...args) {\r\n await this.runPhase('destroy', ...args);\r\n \r\n this.hooks.forEach(handlers => {\r\n handlers.length = 0;\r\n });\r\n }\r\n\r\n getPhaseHandlers(phase) {\r\n return this.hooks.get(phase) || [];\r\n }\r\n\r\n hasHandlers(phase) {\r\n const handlers = this.hooks.get(phase);\r\n return handlers && handlers.length > 0;\r\n }\r\n\r\n getTrace() {\r\n return [...this.trace];\r\n }\r\n\r\n clearTrace() {\r\n this.trace = [];\r\n }\r\n\r\n getState() {\r\n return this.state;\r\n }\r\n\r\n getStateHistory() {\r\n return [...this.stateHistory];\r\n }\r\n\r\n isInState(targetState) {\r\n return this.state === targetState;\r\n }\r\n\r\n onError(handler) {\r\n this._onErrorCallback = handler;\r\n return this.on('error', handler);\r\n }\r\n\r\n setErrorBoundary(boundary) {\r\n this.errorBoundary = boundary;\r\n return this.on('errorBoundary', (errorInfo) => {\r\n if (typeof boundary === 'function') {\r\n return boundary(errorInfo);\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n setMaxErrors(max) {\r\n this.maxErrors = max;\r\n }\r\n\r\n getErrorCount() {\r\n return this.errorCount;\r\n }\r\n\r\n getLastError() {\r\n return this.lastError;\r\n }\r\n\r\n resetErrorCount() {\r\n this.errorCount = 0;\r\n this.lastError = null;\r\n }\r\n\r\n async _handleError(errorInfo) {\r\n this.errorCount++;\r\n this.lastError = errorInfo.error;\r\n\r\n if (this.errorCount >= this.maxErrors) {\r\n console.error(`[KupolaLifecycle] Error limit reached (${this.maxErrors}), stopping error handling`);\r\n return;\r\n }\r\n\r\n await this.emit('error', errorInfo);\r\n\r\n if (typeof this._onErrorCallback === 'function') {\r\n try {\r\n await this._onErrorCallback(errorInfo);\r\n } catch (e) {\r\n console.error('[KupolaLifecycle] Error in onError callback:', e);\r\n }\r\n }\r\n\r\n const boundaryHandlers = this.hooks.get('errorBoundary');\r\n if (boundaryHandlers && boundaryHandlers.length > 0) {\r\n for (const hook of boundaryHandlers) {\r\n try {\r\n const result = hook.handler(errorInfo);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n if (result === 'handled') {\r\n console.debug(`[KupolaLifecycle] Error handled by errorBoundary hook \"${hook.name}\"`);\r\n return;\r\n }\r\n } catch (e) {\r\n console.error(`[KupolaLifecycle] Error in errorBoundary hook \"${hook.name}\":`, e);\r\n }\r\n }\r\n }\r\n\r\n console.error(`[KupolaLifecycle] Unhandled error in ${errorInfo.phase}:`, errorInfo.error);\r\n }\r\n}\r\n\r\nclass KupolaPluginManager {\r\n constructor() {\r\n this.plugins = new Map();\r\n this.enabledPlugins = new Set();\r\n this.pluginHooks = new Map();\r\n }\r\n\r\n register(name, plugin) {\r\n if (this.plugins.has(name)) {\r\n console.warn(`Plugin ${name} already registered, overriding`);\r\n }\r\n \r\n this.plugins.set(name, {\r\n ...plugin,\r\n name,\r\n enabled: false,\r\n instance: null,\r\n lifecycle: new KupolaLifecycle(`plugin:${name}`)\r\n });\r\n }\r\n\r\n async enable(name) {\r\n const plugin = this.plugins.get(name);\r\n if (!plugin) {\r\n throw new Error(`Plugin ${name} not found`);\r\n }\r\n \r\n if (plugin.enabled) return;\r\n \r\n try {\r\n await plugin.lifecycle.bootstrap();\r\n \r\n if (plugin.install) {\r\n plugin.instance = await plugin.install();\r\n }\r\n plugin.enabled = true;\r\n this.enabledPlugins.add(name);\r\n \r\n await plugin.lifecycle.mount();\r\n \r\n if (plugin.hooks) {\r\n this._registerPluginHooks(name, plugin.hooks);\r\n }\r\n \r\n console.log(`Plugin ${name} enabled`);\r\n } catch (error) {\r\n console.error(`Failed to enable plugin ${name}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disable(name) {\r\n const plugin = this.plugins.get(name);\r\n if (!plugin || !plugin.enabled) return;\r\n \r\n try {\r\n await plugin.lifecycle.unmount();\r\n \r\n if (plugin.uninstall) {\r\n await plugin.uninstall(plugin.instance);\r\n }\r\n \r\n if (plugin.hooks) {\r\n this._unregisterPluginHooks(name);\r\n }\r\n \r\n plugin.enabled = false;\r\n this.enabledPlugins.delete(name);\r\n plugin.instance = null;\r\n \r\n await plugin.lifecycle.destroy();\r\n \r\n console.log(`Plugin ${name} disabled`);\r\n } catch (error) {\r\n console.error(`Failed to disable plugin ${name}:`, error);\r\n throw error;\r\n }\r\n }\r\n\r\n get(name) {\r\n const plugin = this.plugins.get(name);\r\n return plugin?.instance || null;\r\n }\r\n\r\n getAll() {\r\n const result = {};\r\n this.plugins.forEach((plugin, name) => {\r\n result[name] = {\r\n name: plugin.name,\r\n enabled: plugin.enabled,\r\n instance: plugin.instance,\r\n state: plugin.lifecycle.getState()\r\n };\r\n });\r\n return result;\r\n }\r\n\r\n getEnabled() {\r\n const result = {};\r\n this.enabledPlugins.forEach(name => {\r\n const plugin = this.plugins.get(name);\r\n if (plugin) {\r\n result[name] = plugin.instance;\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n async enableAll() {\r\n const promises = [];\r\n this.plugins.forEach((_, name) => {\r\n promises.push(this.enable(name));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n async disableAll() {\r\n const promises = [];\r\n this.enabledPlugins.forEach(name => {\r\n promises.push(this.disable(name));\r\n });\r\n await Promise.all(promises);\r\n }\r\n\r\n _registerPluginHooks(pluginName, hooks) {\r\n if (!this.pluginHooks.has(pluginName)) {\r\n this.pluginHooks.set(pluginName, []);\r\n }\r\n \r\n const pluginHooks = this.pluginHooks.get(pluginName);\r\n \r\n Object.keys(hooks).forEach(phase => {\r\n const unsubscribe = window.kupolaLifecycle?.on(phase, hooks[phase], { name: `${pluginName}:${phase}` });\r\n if (unsubscribe) {\r\n pluginHooks.push({ phase, unsubscribe });\r\n }\r\n });\r\n }\r\n\r\n _unregisterPluginHooks(pluginName) {\r\n const pluginHooks = this.pluginHooks.get(pluginName);\r\n if (!pluginHooks) return;\r\n \r\n pluginHooks.forEach(({ unsubscribe }) => {\r\n if (unsubscribe) unsubscribe();\r\n });\r\n \r\n this.pluginHooks.delete(pluginName);\r\n }\r\n}\r\n\r\nconst kupolaLifecycle = new KupolaLifecycle('app');\r\nconst kupolaPluginManager = new KupolaPluginManager();\r\n\r\nfunction createLifecycle(scope = 'app') {\r\n return new KupolaLifecycle(scope);\r\n}\r\n\r\nwindow.KupolaLifecycle = KupolaLifecycle;\r\nwindow.KupolaPluginManager = KupolaPluginManager;\r\nwindow.kupolaLifecycle = kupolaLifecycle;\r\nwindow.kupolaPluginManager = kupolaPluginManager;\r\nwindow.createLifecycle = createLifecycle;","const KupolaUtils = {\r\n string: {\r\n trim(str) {\r\n return str ? str.trim() : '';\r\n },\r\n trimLeft(str) {\r\n return str ? str.replace(/^\\s+/, '') : '';\r\n },\r\n trimRight(str) {\r\n return str ? str.replace(/\\s+$/, '') : '';\r\n },\r\n toUpperCase(str) {\r\n return str ? str.toUpperCase() : '';\r\n },\r\n toLowerCase(str) {\r\n return str ? str.toLowerCase() : '';\r\n },\r\n capitalize(str) {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n },\r\n camelize(str) {\r\n if (!str) return '';\r\n return str.replace(/-(\\w)/g, (_, c) => c ? c.toUpperCase() : '');\r\n },\r\n hyphenate(str) {\r\n if (!str) return '';\r\n return str.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '');\r\n },\r\n padStart(str, length, padChar = ' ') {\r\n return (String(str) || '').padStart(length, padChar);\r\n },\r\n padEnd(str, length, padChar = ' ') {\r\n return (String(str) || '').padEnd(length, padChar);\r\n },\r\n truncate(str, maxLength, suffix = '...') {\r\n if (!str || str.length <= maxLength) return str || '';\r\n return str.slice(0, maxLength) + suffix;\r\n },\r\n replaceAll(str, search, replacement) {\r\n if (!str) return '';\r\n return str.split(search).join(replacement);\r\n },\r\n format(template, data) {\r\n if (!template) return '';\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => data[key] !== undefined ? data[key] : `{{${key}}}`);\r\n },\r\n startsWith(str, prefix) {\r\n return (str || '').startsWith(prefix);\r\n },\r\n endsWith(str, suffix) {\r\n return (str || '').endsWith(suffix);\r\n },\r\n includes(str, search) {\r\n return (str || '').includes(search);\r\n },\r\n repeat(str, times) {\r\n return (str || '').repeat(times);\r\n },\r\n reverse(str) {\r\n return (str || '').split('').reverse().join('');\r\n },\r\n countOccurrences(str, search) {\r\n if (!str || !search) return 0;\r\n return str.split(search).length - 1;\r\n },\r\n escapeHtml(str) {\r\n if (!str) return '';\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML;\r\n },\r\n unescapeHtml(str) {\r\n if (!str) return '';\r\n const div = document.createElement('div');\r\n div.innerHTML = str;\r\n return div.textContent;\r\n },\r\n generateRandom(length = 8) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let result = '';\r\n for (let i = 0; i < length; i++) {\r\n result += chars.charAt(Math.floor(Math.random() * chars.length));\r\n }\r\n return result;\r\n },\r\n generateUUID() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n },\r\n\r\n array: {\r\n isArray(arr) {\r\n return Array.isArray(arr);\r\n },\r\n isEmpty(arr) {\r\n return !arr || arr.length === 0;\r\n },\r\n size(arr) {\r\n return arr ? arr.length : 0;\r\n },\r\n first(arr, defaultValue) {\r\n return arr && arr.length > 0 ? arr[0] : defaultValue;\r\n },\r\n last(arr, defaultValue) {\r\n return arr && arr.length > 0 ? arr[arr.length - 1] : defaultValue;\r\n },\r\n get(arr, index, defaultValue) {\r\n return arr && arr[index] !== undefined ? arr[index] : defaultValue;\r\n },\r\n slice(arr, start, end) {\r\n return arr ? arr.slice(start, end) : [];\r\n },\r\n concat(...args) {\r\n return args.reduce((result, arg) => result.concat(arg || []), []);\r\n },\r\n join(arr, separator = ',') {\r\n return arr ? arr.join(separator) : '';\r\n },\r\n indexOf(arr, item, fromIndex = 0) {\r\n return arr ? arr.indexOf(item, fromIndex) : -1;\r\n },\r\n lastIndexOf(arr, item, fromIndex) {\r\n return arr ? arr.lastIndexOf(item, fromIndex) : -1;\r\n },\r\n includes(arr, item) {\r\n return arr ? arr.includes(item) : false;\r\n },\r\n push(arr, ...items) {\r\n if (arr) arr.push(...items);\r\n return arr;\r\n },\r\n pop(arr) {\r\n return arr ? arr.pop() : undefined;\r\n },\r\n shift(arr) {\r\n return arr ? arr.shift() : undefined;\r\n },\r\n unshift(arr, ...items) {\r\n if (arr) arr.unshift(...items);\r\n return arr;\r\n },\r\n remove(arr, item) {\r\n if (!arr) return arr;\r\n const index = arr.indexOf(item);\r\n if (index > -1) arr.splice(index, 1);\r\n return arr;\r\n },\r\n removeAt(arr, index) {\r\n if (!arr || index < 0 || index >= arr.length) return arr;\r\n arr.splice(index, 1);\r\n return arr;\r\n },\r\n insert(arr, index, item) {\r\n if (!arr) return arr;\r\n arr.splice(index, 0, item);\r\n return arr;\r\n },\r\n reverse(arr) {\r\n return arr ? arr.slice().reverse() : [];\r\n },\r\n sort(arr, compareFn) {\r\n return arr ? arr.slice().sort(compareFn) : [];\r\n },\r\n sortBy(arr, key, order = 'asc') {\r\n if (!arr) return [];\r\n return arr.slice().sort((a, b) => {\r\n const valA = typeof a === 'object' ? a[key] : a;\r\n const valB = typeof b === 'object' ? b[key] : b;\r\n if (valA < valB) return order === 'asc' ? -1 : 1;\r\n if (valA > valB) return order === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n },\r\n filter(arr, predicate) {\r\n return arr ? arr.filter(predicate) : [];\r\n },\r\n map(arr, fn) {\r\n return arr ? arr.map(fn) : [];\r\n },\r\n reduce(arr, fn, initialValue) {\r\n return arr ? arr.reduce(fn, initialValue) : initialValue;\r\n },\r\n forEach(arr, fn) {\r\n if (arr) arr.forEach(fn);\r\n },\r\n every(arr, predicate) {\r\n return arr ? arr.every(predicate) : true;\r\n },\r\n some(arr, predicate) {\r\n return arr ? arr.some(predicate) : false;\r\n },\r\n find(arr, predicate) {\r\n return arr ? arr.find(predicate) : undefined;\r\n },\r\n findIndex(arr, predicate) {\r\n return arr ? arr.findIndex(predicate) : -1;\r\n },\r\n flat(arr, depth = 1) {\r\n return arr ? arr.flat(depth) : [];\r\n },\r\n flattenDeep(arr) {\r\n return arr ? arr.reduce((acc, item) => \r\n Array.isArray(item) ? acc.concat(this.flattenDeep(item)) : acc.concat(item), []) : [];\r\n },\r\n unique(arr) {\r\n return arr ? [...new Set(arr)] : [];\r\n },\r\n uniqueBy(arr, key) {\r\n if (!arr) return [];\r\n const seen = new Set();\r\n return arr.filter(item => {\r\n const value = typeof item === 'object' ? item[key] : item;\r\n if (seen.has(value)) return false;\r\n seen.add(value);\r\n return true;\r\n });\r\n },\r\n chunk(arr, size) {\r\n if (!arr || size <= 0) return [];\r\n const chunks = [];\r\n for (let i = 0; i < arr.length; i += size) {\r\n chunks.push(arr.slice(i, i + size));\r\n }\r\n return chunks;\r\n },\r\n shuffle(arr) {\r\n if (!arr) return [];\r\n const result = arr.slice();\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [result[i], result[j]] = [result[j], result[i]];\r\n }\r\n return result;\r\n },\r\n sum(arr) {\r\n return arr ? arr.reduce((acc, val) => acc + (Number(val) || 0), 0) : 0;\r\n },\r\n average(arr) {\r\n if (!arr || arr.length === 0) return 0;\r\n return this.sum(arr) / arr.length;\r\n },\r\n max(arr) {\r\n return arr && arr.length > 0 ? Math.max(...arr) : -Infinity;\r\n },\r\n min(arr) {\r\n return arr && arr.length > 0 ? Math.min(...arr) : Infinity;\r\n },\r\n intersection(...args) {\r\n if (args.length === 0) return [];\r\n return args.reduce((result, arr) => \r\n result.filter(item => arr && arr.includes(item)));\r\n },\r\n union(...args) {\r\n return [...new Set(args.flat().filter(Boolean))];\r\n },\r\n difference(arr1, arr2) {\r\n return arr1 ? arr1.filter(item => !arr2 || !arr2.includes(item)) : [];\r\n },\r\n zip(...args) {\r\n if (args.length === 0) return [];\r\n const maxLength = Math.max(...args.map(arr => arr ? arr.length : 0));\r\n return Array.from({ length: maxLength }, (_, i) => \r\n args.map(arr => arr && arr[i]));\r\n }\r\n },\r\n\r\n object: {\r\n isObject(obj) {\r\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\r\n },\r\n isEmpty(obj) {\r\n if (!obj || typeof obj !== 'object') return true;\r\n return Object.keys(obj).length === 0;\r\n },\r\n keys(obj) {\r\n return obj ? Object.keys(obj) : [];\r\n },\r\n values(obj) {\r\n return obj ? Object.values(obj) : [];\r\n },\r\n entries(obj) {\r\n return obj ? Object.entries(obj) : [];\r\n },\r\n has(obj, key) {\r\n return obj ? Object.prototype.hasOwnProperty.call(obj, key) : false;\r\n },\r\n get(obj, path, defaultValue) {\r\n if (!obj) return defaultValue;\r\n const keys = path.split('.');\r\n return keys.reduce((current, key) => current && current[key], obj) || defaultValue;\r\n },\r\n set(obj, path, value) {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n let current = obj;\r\n keys.forEach(key => {\r\n if (!current[key]) current[key] = {};\r\n current = current[key];\r\n });\r\n current[lastKey] = value;\r\n return obj;\r\n },\r\n pick(obj, keys) {\r\n if (!obj) return {};\r\n return keys.reduce((result, key) => {\r\n if (obj[key] !== undefined) result[key] = obj[key];\r\n return result;\r\n }, {});\r\n },\r\n omit(obj, keys) {\r\n if (!obj) return {};\r\n return Object.keys(obj).reduce((result, key) => {\r\n if (!keys.includes(key)) result[key] = obj[key];\r\n return result;\r\n }, {});\r\n },\r\n merge(...args) {\r\n return args.reduce((result, obj) => {\r\n if (obj && typeof obj === 'object') {\r\n Object.keys(obj).forEach(key => {\r\n if (this.isObject(obj[key]) && this.isObject(result[key])) {\r\n result[key] = this.merge(result[key], obj[key]);\r\n } else {\r\n result[key] = obj[key];\r\n }\r\n });\r\n }\r\n return result;\r\n }, {});\r\n },\r\n clone(obj) {\r\n return obj ? JSON.parse(JSON.stringify(obj)) : obj;\r\n },\r\n deepClone(obj, hash = new WeakMap()) {\r\n if (!obj || typeof obj !== 'object') return obj;\r\n if (hash.has(obj)) return hash.get(obj);\r\n if (obj instanceof Date) return new Date(obj);\r\n if (obj instanceof RegExp) return new RegExp(obj);\r\n if (obj instanceof Map) {\r\n const map = new Map();\r\n hash.set(obj, map);\r\n obj.forEach((val, key) => map.set(key, this.deepClone(val, hash)));\r\n return map;\r\n }\r\n if (obj instanceof Set) {\r\n const set = new Set();\r\n hash.set(obj, set);\r\n obj.forEach(val => set.add(this.deepClone(val, hash)));\r\n return set;\r\n }\r\n if (Array.isArray(obj)) {\r\n const arr = [];\r\n hash.set(obj, arr);\r\n obj.forEach(item => arr.push(this.deepClone(item, hash)));\r\n return arr;\r\n }\r\n const clone = {};\r\n hash.set(obj, clone);\r\n Object.keys(obj).forEach(key => {\r\n clone[key] = this.deepClone(obj[key], hash);\r\n });\r\n return clone;\r\n },\r\n forEach(obj, fn) {\r\n if (!obj) return;\r\n Object.keys(obj).forEach(key => fn(obj[key], key, obj));\r\n },\r\n map(obj, fn) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n result[key] = fn(obj[key], key, obj);\r\n });\r\n return result;\r\n },\r\n filter(obj, fn) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n if (fn(obj[key], key, obj)) result[key] = obj[key];\r\n });\r\n return result;\r\n },\r\n reduce(obj, fn, initialValue) {\r\n if (!obj) return initialValue;\r\n return Object.keys(obj).reduce((acc, key) => \r\n fn(acc, obj[key], key, obj), initialValue);\r\n },\r\n toArray(obj) {\r\n if (!obj) return [];\r\n return Object.keys(obj).map(key => ({ key, value: obj[key] }));\r\n },\r\n fromArray(arr, keyField, valueField) {\r\n if (!arr) return {};\r\n return arr.reduce((result, item) => {\r\n const key = typeof item === 'object' ? item[keyField] : item;\r\n const value = valueField ? item[valueField] : item;\r\n if (key !== undefined) result[key] = value;\r\n return result;\r\n }, {});\r\n },\r\n size(obj) {\r\n return obj ? Object.keys(obj).length : 0;\r\n },\r\n invert(obj) {\r\n if (!obj) return {};\r\n const result = {};\r\n Object.keys(obj).forEach(key => {\r\n result[obj[key]] = key;\r\n });\r\n return result;\r\n },\r\n isEqual(obj1, obj2) {\r\n if (obj1 === obj2) return true;\r\n if (!obj1 || !obj2 || typeof obj1 !== 'object' || typeof obj2 !== 'object') return false;\r\n const keys1 = Object.keys(obj1);\r\n const keys2 = Object.keys(obj2);\r\n if (keys1.length !== keys2.length) return false;\r\n return keys1.every(key => this.isEqual(obj1[key], obj2[key]));\r\n },\r\n freeze(obj) {\r\n if (!obj) return obj;\r\n Object.freeze(obj);\r\n Object.keys(obj).forEach(key => {\r\n if (typeof obj[key] === 'object') this.freeze(obj[key]);\r\n });\r\n return obj;\r\n },\r\n seal(obj) {\r\n return obj ? Object.seal(obj) : obj;\r\n }\r\n },\r\n\r\n number: {\r\n isNumber(val) {\r\n return typeof val === 'number' && !isNaN(val);\r\n },\r\n isInteger(val) {\r\n return Number.isInteger(val);\r\n },\r\n isFloat(val) {\r\n return this.isNumber(val) && !Number.isInteger(val);\r\n },\r\n isPositive(val) {\r\n return this.isNumber(val) && val > 0;\r\n },\r\n isNegative(val) {\r\n return this.isNumber(val) && val < 0;\r\n },\r\n isZero(val) {\r\n return this.isNumber(val) && val === 0;\r\n },\r\n clamp(val, min, max) {\r\n if (!this.isNumber(val)) return val;\r\n return Math.min(Math.max(val, min), max);\r\n },\r\n round(val, precision = 0) {\r\n if (!this.isNumber(val)) return val;\r\n const factor = Math.pow(10, precision);\r\n return Math.round(val * factor) / factor;\r\n },\r\n floor(val) {\r\n return this.isNumber(val) ? Math.floor(val) : val;\r\n },\r\n ceil(val) {\r\n return this.isNumber(val) ? Math.ceil(val) : val;\r\n },\r\n abs(val) {\r\n return this.isNumber(val) ? Math.abs(val) : val;\r\n },\r\n min(...args) {\r\n const nums = args.filter(this.isNumber);\r\n return nums.length > 0 ? Math.min(...nums) : undefined;\r\n },\r\n max(...args) {\r\n const nums = args.filter(this.isNumber);\r\n return nums.length > 0 ? Math.max(...nums) : undefined;\r\n },\r\n sum(...args) {\r\n const nums = args.flat().filter(this.isNumber);\r\n return nums.reduce((acc, val) => acc + val, 0);\r\n },\r\n average(...args) {\r\n const nums = args.flat().filter(this.isNumber);\r\n return nums.length > 0 ? this.sum(nums) / nums.length : 0;\r\n },\r\n random(min = 0, max = 1) {\r\n return Math.random() * (max - min) + min;\r\n },\r\n randomInt(min, max) {\r\n return Math.floor(this.random(min, max + 1));\r\n },\r\n format(val, decimals = 2) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toFixed(decimals);\r\n },\r\n formatCurrency(val, currency = 'CNY', decimals = 2) {\r\n if (!this.isNumber(val)) return String(val);\r\n const formatter = new Intl.NumberFormat('zh-CN', {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals\r\n });\r\n return formatter.format(val);\r\n },\r\n formatPercent(val, decimals = 0) {\r\n if (!this.isNumber(val)) return String(val);\r\n return `${(val * 100).toFixed(decimals)}%`;\r\n },\r\n toFixed(val, decimals = 0) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toFixed(decimals);\r\n },\r\n toPrecision(val, precision = 6) {\r\n if (!this.isNumber(val)) return String(val);\r\n return val.toPrecision(precision);\r\n },\r\n isNaN(val) {\r\n return Number.isNaN(val);\r\n },\r\n isFinite(val) {\r\n return Number.isFinite(val);\r\n },\r\n parseInt(val, radix = 10) {\r\n return Number.parseInt(val, radix);\r\n },\r\n parseFloat(val) {\r\n return Number.parseFloat(val);\r\n },\r\n toNumber(val, defaultValue = 0) {\r\n const num = Number(val);\r\n return isNaN(num) ? defaultValue : num;\r\n },\r\n safeDivide(a, b, defaultValue = 0) {\r\n if (!this.isNumber(a) || !this.isNumber(b) || b === 0) return defaultValue;\r\n return a / b;\r\n },\r\n safeMultiply(...args) {\r\n return args.reduce((result, val) => {\r\n if (!this.isNumber(result) || !this.isNumber(val)) return 0;\r\n return result * val;\r\n }, 1);\r\n }\r\n },\r\n\r\n date: {\r\n now() {\r\n return Date.now();\r\n },\r\n today() {\r\n const now = new Date();\r\n now.setHours(0, 0, 0, 0);\r\n return now;\r\n },\r\n tomorrow() {\r\n const date = this.today();\r\n date.setDate(date.getDate() + 1);\r\n return date;\r\n },\r\n yesterday() {\r\n const date = this.today();\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n },\r\n isDate(val) {\r\n return val instanceof Date && !isNaN(val.getTime());\r\n },\r\n isValid(date) {\r\n return this.isDate(date);\r\n },\r\n parse(str) {\r\n const date = new Date(str);\r\n return this.isValid(date) ? date : null;\r\n },\r\n format(date, formatStr = 'YYYY-MM-DD HH:mm:ss') {\r\n if (!this.isDate(date)) return '';\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hours = String(date.getHours()).padStart(2, '0');\r\n const minutes = String(date.getMinutes()).padStart(2, '0');\r\n const seconds = String(date.getSeconds()).padStart(2, '0');\r\n const milliseconds = String(date.getMilliseconds()).padStart(3, '0');\r\n const weekDays = ['日', '一', '二', '三', '四', '五', '六'];\r\n const weekDay = weekDays[date.getDay()];\r\n \r\n return formatStr\r\n .replace('YYYY', year)\r\n .replace('MM', month)\r\n .replace('DD', day)\r\n .replace('HH', hours)\r\n .replace('mm', minutes)\r\n .replace('ss', seconds)\r\n .replace('SSS', milliseconds)\r\n .replace('D', date.getDate())\r\n .replace('M', date.getMonth() + 1)\r\n .replace('H', date.getHours())\r\n .replace('m', date.getMinutes())\r\n .replace('s', date.getSeconds())\r\n .replace('W', weekDay);\r\n },\r\n toISO(date) {\r\n return this.isDate(date) ? date.toISOString() : '';\r\n },\r\n toUTC(date) {\r\n return this.isDate(date) ? new Date(date.toUTCString()) : null;\r\n },\r\n addDays(date, days) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setDate(newDate.getDate() + days);\r\n return newDate;\r\n },\r\n addHours(date, hours) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(newDate.getHours() + hours);\r\n return newDate;\r\n },\r\n addMinutes(date, minutes) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setMinutes(newDate.getMinutes() + minutes);\r\n return newDate;\r\n },\r\n addSeconds(date, seconds) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setSeconds(newDate.getSeconds() + seconds);\r\n return newDate;\r\n },\r\n diffDays(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n const d1 = this.today();\r\n const d2 = this.today();\r\n d1.setTime(date1.getTime());\r\n d2.setTime(date2.getTime());\r\n return Math.floor((d1.getTime() - d2.getTime()) / (1000 * 60 * 60 * 24));\r\n },\r\n diffHours(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60 * 60));\r\n },\r\n diffMinutes(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / (1000 * 60));\r\n },\r\n diffSeconds(date1, date2) {\r\n if (!this.isDate(date1) || !this.isDate(date2)) return 0;\r\n return Math.floor((date1.getTime() - date2.getTime()) / 1000);\r\n },\r\n isToday(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === 0;\r\n },\r\n isYesterday(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === -1;\r\n },\r\n isTomorrow(date) {\r\n if (!this.isDate(date)) return false;\r\n return this.diffDays(date, this.today()) === 1;\r\n },\r\n isFuture(date) {\r\n if (!this.isDate(date)) return false;\r\n return date.getTime() > this.now();\r\n },\r\n isPast(date) {\r\n if (!this.isDate(date)) return false;\r\n return date.getTime() < this.now();\r\n },\r\n isLeapYear(date) {\r\n if (!this.isDate(date)) return false;\r\n const year = date.getFullYear();\r\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\r\n },\r\n getDaysInMonth(date) {\r\n if (!this.isDate(date)) return 0;\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n return new Date(year, month + 1, 0).getDate();\r\n },\r\n getWeekOfYear(date) {\r\n if (!this.isDate(date)) return 0;\r\n const startOfYear = new Date(date.getFullYear(), 0, 1);\r\n const diff = date.getTime() - startOfYear.getTime();\r\n return Math.ceil(diff / (1000 * 60 * 60 * 24 * 7));\r\n },\r\n getQuarter(date) {\r\n if (!this.isDate(date)) return 0;\r\n return Math.ceil((date.getMonth() + 1) / 3);\r\n },\r\n startOfDay(date) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(0, 0, 0, 0);\r\n return newDate;\r\n },\r\n endOfDay(date) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n newDate.setHours(23, 59, 59, 999);\r\n return newDate;\r\n },\r\n startOfMonth(date) {\r\n if (!this.isDate(date)) return date;\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n },\r\n endOfMonth(date) {\r\n if (!this.isDate(date)) return date;\r\n return new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59, 999);\r\n },\r\n startOfWeek(date, startDay = 1) {\r\n if (!this.isDate(date)) return date;\r\n const newDate = new Date(date);\r\n const day = newDate.getDay();\r\n const diff = day >= startDay ? day - startDay : day + (7 - startDay);\r\n newDate.setDate(newDate.getDate() - diff);\r\n newDate.setHours(0, 0, 0, 0);\r\n return newDate;\r\n },\r\n endOfWeek(date, startDay = 1) {\r\n if (!this.isDate(date)) return date;\r\n const start = this.startOfWeek(date, startDay);\r\n const end = new Date(start);\r\n end.setDate(end.getDate() + 6);\r\n end.setHours(23, 59, 59, 999);\r\n return end;\r\n },\r\n getAge(birthDate) {\r\n if (!this.isDate(birthDate)) return 0;\r\n const now = new Date();\r\n let age = now.getFullYear() - birthDate.getFullYear();\r\n if (now.getMonth() < birthDate.getMonth() || \r\n (now.getMonth() === birthDate.getMonth() && now.getDate() < birthDate.getDate())) {\r\n age--;\r\n }\r\n return Math.max(0, age);\r\n },\r\n fromNow(date) {\r\n if (!this.isDate(date)) return '';\r\n const now = this.now();\r\n const diff = now - date.getTime();\r\n const minute = 60 * 1000;\r\n const hour = 60 * minute;\r\n const day = 24 * hour;\r\n const week = 7 * day;\r\n const month = 30 * day;\r\n const year = 365 * day;\r\n \r\n if (diff < minute) return '刚刚';\r\n if (diff < hour) return `${Math.floor(diff / minute)}分钟前`;\r\n if (diff < day) return `${Math.floor(diff / hour)}小时前`;\r\n if (diff < week) return `${Math.floor(diff / day)}天前`;\r\n if (diff < month) return `${Math.floor(diff / week)}周前`;\r\n if (diff < year) return `${Math.floor(diff / month)}个月前`;\r\n return `${Math.floor(diff / year)}年前`;\r\n }\r\n },\r\n\r\n debounce(func, wait, options = {}) {\r\n let timeout = null;\r\n let lastArgs = null;\r\n let lastThis = null;\r\n let lastCallTime = 0;\r\n \r\n const leading = options.leading || false;\r\n const trailing = options.trailing !== false;\r\n \r\n function invokeFunc() {\r\n func.apply(lastThis, lastArgs);\r\n }\r\n \r\n function leadingEdge() {\r\n lastCallTime = Date.now();\r\n if (leading) {\r\n timeout = setTimeout(trailingEdge, wait);\r\n invokeFunc();\r\n } else {\r\n timeout = setTimeout(trailingEdge, wait);\r\n }\r\n }\r\n \r\n function trailingEdge() {\r\n timeout = null;\r\n if (trailing && lastArgs) {\r\n invokeFunc();\r\n }\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n \r\n function remainingWait() {\r\n const timeSinceLastCall = Date.now() - lastCallTime;\r\n return Math.max(0, wait - timeSinceLastCall);\r\n }\r\n \r\n return function(...args) {\r\n lastArgs = args;\r\n lastThis = this;\r\n lastCallTime = Date.now();\r\n \r\n if (!timeout) {\r\n leadingEdge();\r\n } else {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(trailingEdge, remainingWait());\r\n }\r\n };\r\n },\r\n\r\n throttle(func, limit, options = {}) {\r\n let inThrottle = false;\r\n const trailing = options.trailing || false;\r\n let lastArgs = null;\r\n let lastThis = null;\r\n \r\n function invokeFunc() {\r\n func.apply(lastThis, lastArgs);\r\n lastArgs = null;\r\n lastThis = null;\r\n }\r\n \r\n return function(...args) {\r\n if (!inThrottle) {\r\n inThrottle = true;\r\n lastArgs = args;\r\n lastThis = this;\r\n invokeFunc();\r\n setTimeout(() => {\r\n inThrottle = false;\r\n if (trailing && lastArgs) {\r\n invokeFunc();\r\n }\r\n }, limit);\r\n } else if (trailing) {\r\n lastArgs = args;\r\n lastThis = this;\r\n }\r\n };\r\n },\r\n\r\n validator: {\r\n isEmail(str) {\r\n const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n return regex.test(str || '');\r\n },\r\n isPhone(str) {\r\n const regex = /^1[3-9]\\d{9}$/;\r\n return regex.test(str || '');\r\n },\r\n isURL(str) {\r\n const regex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w.-]*)*\\/?$/;\r\n return regex.test(str || '');\r\n },\r\n isIPv4(str) {\r\n const regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\r\n return regex.test(str || '');\r\n },\r\n isIPv6(str) {\r\n const regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;\r\n return regex.test(str || '');\r\n },\r\n isIP(str) {\r\n return this.isIPv4(str) || this.isIPv6(str);\r\n },\r\n isIDCard(str) {\r\n const regex = /^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$/;\r\n return regex.test(str || '');\r\n },\r\n isPassport(str) {\r\n const regex = /^[A-Z][0-9]{8}$|^[A-Z]{2}[0-9]{7}$/;\r\n return regex.test(str || '');\r\n },\r\n isCreditCard(str) {\r\n const regex = /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9]{2})[0-9]{12}|3[47][0-9]{13})$/;\r\n const cleanStr = str.replace(/\\s/g, '');\r\n if (!regex.test(cleanStr)) return false;\r\n let sum = 0;\r\n let alternate = false;\r\n for (let i = cleanStr.length - 1; i >= 0; i--) {\r\n let digit = parseInt(cleanStr[i], 10);\r\n if (alternate) {\r\n digit *= 2;\r\n if (digit > 9) digit -= 9;\r\n }\r\n sum += digit;\r\n alternate = !alternate;\r\n }\r\n return sum % 10 === 0;\r\n },\r\n isHexColor(str) {\r\n const regex = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\r\n return regex.test(str || '');\r\n },\r\n isRGB(str) {\r\n const regex = /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/;\r\n const match = regex.exec(str || '');\r\n if (!match) return false;\r\n return match.slice(1).every(val => parseInt(val) >= 0 && parseInt(val) <= 255);\r\n },\r\n isRGBA(str) {\r\n const regex = /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*([01]|0\\.\\d+)\\)$/;\r\n const match = regex.exec(str || '');\r\n if (!match) return false;\r\n const [, r, g, b, a] = match;\r\n return parseInt(r) >= 0 && parseInt(r) <= 255 &&\r\n parseInt(g) >= 0 && parseInt(g) <= 255 &&\r\n parseInt(b) >= 0 && parseInt(b) <= 255 &&\r\n parseFloat(a) >= 0 && parseFloat(a) <= 1;\r\n },\r\n isColor(str) {\r\n return this.isHexColor(str) || this.isRGB(str) || this.isRGBA(str);\r\n },\r\n isDate(str) {\r\n return !isNaN(new Date(str).getTime());\r\n },\r\n isJSON(str) {\r\n try {\r\n JSON.parse(str);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n },\r\n isEmpty(str) {\r\n return !str || str.trim() === '';\r\n },\r\n isWhitespace(str) {\r\n return /^\\s+$/.test(str || '');\r\n },\r\n isNumber(str) {\r\n return !isNaN(parseFloat(str)) && isFinite(str);\r\n },\r\n isInteger(str) {\r\n return /^-?\\d+$/.test(str || '');\r\n },\r\n isFloat(str) {\r\n return /^-?\\d+\\.\\d+$/.test(str || '');\r\n },\r\n isPositive(str) {\r\n const num = parseFloat(str);\r\n return !isNaN(num) && num > 0;\r\n },\r\n isNegative(str) {\r\n const num = parseFloat(str);\r\n return !isNaN(num) && num < 0;\r\n },\r\n isAlpha(str) {\r\n return /^[a-zA-Z]+$/.test(str || '');\r\n },\r\n isAlphaNumeric(str) {\r\n return /^[a-zA-Z0-9]+$/.test(str || '');\r\n },\r\n isChinese(str) {\r\n return /^[\\u4e00-\\u9fa5]+$/.test(str || '');\r\n },\r\n isLength(str, min, max) {\r\n const len = (str || '').length;\r\n return len >= min && (max === undefined || len <= max);\r\n },\r\n minLength(str, min) {\r\n return (str || '').length >= min;\r\n },\r\n maxLength(str, max) {\r\n return (str || '').length <= max;\r\n },\r\n matches(str, regex) {\r\n return (regex instanceof RegExp) ? regex.test(str || '') : false;\r\n },\r\n equals(str1, str2) {\r\n return String(str1) === String(str2);\r\n },\r\n contains(str, substring) {\r\n return (str || '').includes(substring);\r\n },\r\n notContains(str, substring) {\r\n return !this.contains(str, substring);\r\n },\r\n isArray(arr) {\r\n return Array.isArray(arr);\r\n },\r\n arrayLength(arr, min, max) {\r\n const len = arr ? arr.length : 0;\r\n return len >= min && (max === undefined || len <= max);\r\n },\r\n arrayMinLength(arr, min) {\r\n return arr ? arr.length >= min : false;\r\n },\r\n arrayMaxLength(arr, max) {\r\n return arr ? arr.length <= max : false;\r\n },\r\n isObject(obj) {\r\n return obj !== null && typeof obj === 'object' && !Array.isArray(obj);\r\n },\r\n hasKeys(obj, keys) {\r\n if (!obj || !keys || !Array.isArray(keys)) return false;\r\n return keys.every(key => Object.prototype.hasOwnProperty.call(obj, key));\r\n },\r\n validate(obj, rules) {\r\n const errors = {};\r\n Object.keys(rules).forEach(key => {\r\n const value = obj[key];\r\n const fieldRules = rules[key];\r\n const fieldErrors = [];\r\n \r\n fieldRules.forEach(rule => {\r\n if (typeof rule === 'string') {\r\n const [name, ...params] = rule.split(':');\r\n if (!this[name](value, ...params)) {\r\n fieldErrors.push(name);\r\n }\r\n } else if (typeof rule === 'function') {\r\n const result = rule(value, obj);\r\n if (result !== true) {\r\n fieldErrors.push(result || 'validation_failed');\r\n }\r\n }\r\n });\r\n \r\n if (fieldErrors.length > 0) {\r\n errors[key] = fieldErrors;\r\n }\r\n });\r\n \r\n return {\r\n valid: Object.keys(errors).length === 0,\r\n errors\r\n };\r\n }\r\n },\r\n\r\n crypto: {\r\n md5(str) {\r\n const message = str ? String(str) : '';\r\n const md5Array = [\r\n 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476\r\n ];\r\n \r\n const K = [\r\n 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,\r\n 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\r\n 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,\r\n 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\r\n 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,\r\n 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\r\n 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,\r\n 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\r\n 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,\r\n 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\r\n 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,\r\n 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\r\n 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,\r\n 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\r\n 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,\r\n 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391\r\n ];\r\n \r\n const S = [\r\n [7, 12, 17, 22], [5, 9, 14, 20], [4, 11, 16, 23], [6, 10, 15, 21]\r\n ];\r\n \r\n function leftRotate(value, shift) {\r\n return (value << shift) | (value >>> (32 - shift));\r\n }\r\n \r\n function addPadding(message) {\r\n const bitLength = message.length * 8;\r\n message += '\\x80';\r\n while ((message.length % 64) !== 56) {\r\n message += '\\x00';\r\n }\r\n const lowBytes = bitLength & 0xffffffff;\r\n const highBytes = (bitLength >>> 32) & 0xffffffff;\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((highBytes >>> (8 * i)) & 0xff);\r\n }\r\n return message;\r\n }\r\n \r\n function processBlock(block, state) {\r\n const [a, b, c, d] = state;\r\n const words = [];\r\n for (let i = 0; i < 16; i++) {\r\n words[i] = (block.charCodeAt(i * 4) & 0xff) |\r\n ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) |\r\n ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) |\r\n ((block.charCodeAt(i * 4 + 3) & 0xff) << 24);\r\n }\r\n \r\n let AA = a, BB = b, CC = c, DD = d;\r\n \r\n for (let i = 0; i < 64; i++) {\r\n let f, g;\r\n const round = Math.floor(i / 16);\r\n const wordIndex = i % 16;\r\n \r\n if (round === 0) {\r\n f = (BB & CC) | (~BB & DD);\r\n g = wordIndex;\r\n } else if (round === 1) {\r\n f = (DD & BB) | (~DD & CC);\r\n g = (5 * wordIndex + 1) % 16;\r\n } else if (round === 2) {\r\n f = BB ^ CC ^ DD;\r\n g = (3 * wordIndex + 5) % 16;\r\n } else {\r\n f = CC ^ (BB | ~DD);\r\n g = (7 * wordIndex) % 16;\r\n }\r\n \r\n const temp = DD;\r\n DD = CC;\r\n CC = BB;\r\n BB = BB + leftRotate((AA + f + K[i] + words[g]) & 0xffffffff, S[round][i % 4]);\r\n AA = temp;\r\n }\r\n \r\n return [\r\n (a + AA) & 0xffffffff,\r\n (b + BB) & 0xffffffff,\r\n (c + CC) & 0xffffffff,\r\n (d + DD) & 0xffffffff\r\n ];\r\n }\r\n \r\n const paddedMessage = addPadding(message);\r\n let state = [...md5Array];\r\n \r\n for (let i = 0; i < paddedMessage.length; i += 64) {\r\n state = processBlock(paddedMessage.substring(i, i + 64), state);\r\n }\r\n \r\n let result = '';\r\n state.forEach(word => {\r\n for (let i = 0; i < 4; i++) {\r\n result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0');\r\n }\r\n });\r\n \r\n return result;\r\n },\r\n \r\n sha256(str) {\r\n const message = str ? String(str) : '';\r\n const K = [\r\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\r\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\r\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\r\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\r\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\r\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\r\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\r\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\r\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\r\n ];\r\n \r\n function rightRotate(value, shift) {\r\n return (value >>> shift) | (value << (32 - shift));\r\n }\r\n \r\n function addPadding(message) {\r\n const bitLength = message.length * 8;\r\n message += '\\x80';\r\n while ((message.length % 64) !== 56) {\r\n message += '\\x00';\r\n }\r\n const lowBytes = bitLength & 0xffffffff;\r\n const highBytes = (bitLength >>> 32) & 0xffffffff;\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((highBytes >>> (8 * i)) & 0xff);\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n message += String.fromCharCode((lowBytes >>> (8 * i)) & 0xff);\r\n }\r\n return message;\r\n }\r\n \r\n function processBlock(block, state) {\r\n const words = [];\r\n for (let i = 0; i < 16; i++) {\r\n words[i] = (block.charCodeAt(i * 4) & 0xff) |\r\n ((block.charCodeAt(i * 4 + 1) & 0xff) << 8) |\r\n ((block.charCodeAt(i * 4 + 2) & 0xff) << 16) |\r\n ((block.charCodeAt(i * 4 + 3) & 0xff) << 24);\r\n }\r\n \r\n for (let i = 16; i < 64; i++) {\r\n const s0 = rightRotate(words[i - 15], 7) ^ rightRotate(words[i - 15], 18) ^ (words[i - 15] >>> 3);\r\n const s1 = rightRotate(words[i - 2], 17) ^ rightRotate(words[i - 2], 19) ^ (words[i - 2] >>> 10);\r\n words[i] = (words[i - 16] + s0 + words[i - 7] + s1) & 0xffffffff;\r\n }\r\n \r\n let [a, b, c, d, e, f, g, h] = state;\r\n \r\n for (let i = 0; i < 64; i++) {\r\n const S1 = rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25);\r\n const ch = (e & f) ^ (~e & g);\r\n const temp1 = (h + S1 + ch + K[i] + words[i]) & 0xffffffff;\r\n const S0 = rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22);\r\n const maj = (a & b) ^ (a & c) ^ (b & c);\r\n const temp2 = (S0 + maj) & 0xffffffff;\r\n \r\n h = g;\r\n g = f;\r\n f = e;\r\n e = (d + temp1) & 0xffffffff;\r\n d = c;\r\n c = b;\r\n b = a;\r\n a = (temp1 + temp2) & 0xffffffff;\r\n }\r\n \r\n return [\r\n (state[0] + a) & 0xffffffff,\r\n (state[1] + b) & 0xffffffff,\r\n (state[2] + c) & 0xffffffff,\r\n (state[3] + d) & 0xffffffff,\r\n (state[4] + e) & 0xffffffff,\r\n (state[5] + f) & 0xffffffff,\r\n (state[6] + g) & 0xffffffff,\r\n (state[7] + h) & 0xffffffff\r\n ];\r\n }\r\n \r\n const paddedMessage = addPadding(message);\r\n let state = [\r\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\r\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\r\n ];\r\n \r\n for (let i = 0; i < paddedMessage.length; i += 64) {\r\n state = processBlock(paddedMessage.substring(i, i + 64), state);\r\n }\r\n \r\n let result = '';\r\n state.forEach(word => {\r\n for (let i = 3; i >= 0; i--) {\r\n result += ((word >>> (8 * i)) & 0xff).toString(16).padStart(2, '0');\r\n }\r\n });\r\n \r\n return result;\r\n },\r\n \r\n base64Encode(str) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n let result = '';\r\n let i = 0;\r\n const bytes = str ? str.split('').map(c => c.charCodeAt(0)) : [];\r\n \r\n while (i < bytes.length) {\r\n const byte1 = bytes[i++];\r\n const byte2 = bytes[i++] || 0;\r\n const byte3 = bytes[i++] || 0;\r\n \r\n const enc1 = byte1 >> 2;\r\n const enc2 = ((byte1 & 3) << 4) | (byte2 >> 4);\r\n const enc3 = ((byte2 & 15) << 2) | (byte3 >> 6);\r\n const enc4 = byte3 & 63;\r\n \r\n result += chars[enc1] + chars[enc2] + \r\n (i > bytes.length + 1 ? '=' : chars[enc3]) + \r\n (i > bytes.length ? '=' : chars[enc4]);\r\n }\r\n \r\n return result;\r\n },\r\n \r\n base64Decode(str) {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n let result = '';\r\n let i = 0;\r\n str = str.replace(/[^A-Za-z0-9+/=]/g, '');\r\n \r\n while (i < str.length) {\r\n const enc1 = chars.indexOf(str.charAt(i++));\r\n const enc2 = chars.indexOf(str.charAt(i++));\r\n const enc3 = chars.indexOf(str.charAt(i++));\r\n const enc4 = chars.indexOf(str.charAt(i++));\r\n \r\n const byte1 = (enc1 << 2) | (enc2 >> 4);\r\n const byte2 = ((enc2 & 15) << 4) | (enc3 >> 2);\r\n const byte3 = ((enc3 & 3) << 6) | enc4;\r\n \r\n result += String.fromCharCode(byte1);\r\n if (enc3 !== 64) result += String.fromCharCode(byte2);\r\n if (enc4 !== 64) result += String.fromCharCode(byte3);\r\n }\r\n \r\n return result;\r\n },\r\n \r\n uuid() {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = Math.random() * 16 | 0;\r\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n }\r\n },\r\n\r\n preload: {\r\n cache: new Map(),\r\n\r\n async loadImage(url, options = {}) {\r\n const { crossOrigin = 'anonymous' } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.crossOrigin = crossOrigin;\r\n \r\n img.onload = () => {\r\n this.cache.set(url, img);\r\n resolve(img);\r\n };\r\n \r\n img.onerror = () => {\r\n reject(new Error(`Failed to load image: ${url}`));\r\n };\r\n \r\n img.src = url;\r\n });\r\n },\r\n\r\n async loadImages(urls, options = {}) {\r\n const { parallel = true } = options;\r\n \r\n if (parallel) {\r\n return Promise.all(urls.map(url => this.loadImage(url, options)));\r\n }\r\n \r\n const results = [];\r\n for (const url of urls) {\r\n results.push(await this.loadImage(url, options));\r\n }\r\n return results;\r\n },\r\n\r\n async loadScript(url, options = {}) {\r\n const { type = 'text/javascript', async = true, defer = false } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.type = type;\r\n script.async = async;\r\n script.defer = defer;\r\n \r\n script.onload = () => {\r\n this.cache.set(url, script);\r\n resolve(script);\r\n };\r\n \r\n script.onerror = () => {\r\n script.remove();\r\n reject(new Error(`Failed to load script: ${url}`));\r\n };\r\n \r\n script.src = url;\r\n document.head.appendChild(script);\r\n });\r\n },\r\n\r\n async loadStylesheet(url, options = {}) {\r\n const { media = 'all' } = options;\r\n \r\n if (this.cache.has(url)) {\r\n return this.cache.get(url);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url;\r\n link.media = media;\r\n \r\n link.onload = () => {\r\n this.cache.set(url, link);\r\n resolve(link);\r\n };\r\n \r\n link.onerror = () => {\r\n link.remove();\r\n reject(new Error(`Failed to load stylesheet: ${url}`));\r\n };\r\n \r\n document.head.appendChild(link);\r\n });\r\n },\r\n\r\n async loadFont(fontFamily, src, options = {}) {\r\n const { weight = 'normal', style = 'normal' } = options;\r\n const fontFace = new FontFace(fontFamily, `url(${src})`, { weight, style });\r\n \r\n try {\r\n await fontFace.load();\r\n document.fonts.add(fontFace);\r\n return fontFace;\r\n } catch (e) {\r\n throw new Error(`Failed to load font: ${fontFamily}`);\r\n }\r\n },\r\n\r\n async preload(url, type = 'image') {\r\n switch (type) {\r\n case 'image':\r\n return this.loadImage(url);\r\n case 'script':\r\n return this.loadScript(url);\r\n case 'stylesheet':\r\n case 'style':\r\n return this.loadStylesheet(url);\r\n default:\r\n throw new Error(`Unsupported preload type: ${type}`);\r\n }\r\n },\r\n\r\n isLoaded(url) {\r\n return this.cache.has(url);\r\n },\r\n\r\n clearCache() {\r\n this.cache.clear();\r\n },\r\n\r\n clearCacheByUrl(url) {\r\n this.cache.delete(url);\r\n }\r\n }\r\n};\r\n\r\nwindow.KupolaUtils = KupolaUtils;\r\nwindow.kupolaUtils = KupolaUtils;","class TrieNode {\r\n constructor() {\r\n this.children = {};\r\n this.keys = [];\r\n }\r\n}\r\n\r\nclass PathTrie {\r\n constructor() {\r\n this.root = new TrieNode();\r\n }\r\n\r\n insert(key) {\r\n let node = this.root;\r\n const parts = key.split('.');\r\n \r\n parts.forEach((part, index) => {\r\n if (!node.children[part]) {\r\n node.children[part] = new TrieNode();\r\n }\r\n node = node.children[part];\r\n if (index === parts.length - 1) {\r\n node.keys.push(key);\r\n }\r\n });\r\n }\r\n\r\n getSubKeys(key) {\r\n let node = this.root;\r\n const parts = key.split('.');\r\n const result = [];\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const part = parts[i];\r\n if (!node.children[part]) {\r\n break;\r\n }\r\n node = node.children[part];\r\n \r\n const collectKeys = (n) => {\r\n if (n.keys.length > 0) {\r\n result.push(...n.keys);\r\n }\r\n Object.values(n.children).forEach(child => collectKeys(child));\r\n };\r\n collectKeys(node);\r\n }\r\n\r\n return [...new Set(result)];\r\n }\r\n\r\n getParentKeys(key) {\r\n const parts = key.split('.');\r\n const result = [];\r\n \r\n for (let i = 1; i <= parts.length; i++) {\r\n const parentPath = parts.slice(0, i).join('.');\r\n result.push(parentPath);\r\n }\r\n \r\n return result;\r\n }\r\n}\r\n\r\nconst REACTIVE_SYMBOLS = {\r\n parent: Symbol('reactive_parent'),\r\n path: Symbol('reactive_path'),\r\n isReactive: Symbol('reactive_is_reactive')\r\n};\r\n\r\nclass KupolaDataBind {\r\n constructor() {\r\n this.rawData = {};\r\n this.data = null;\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue = new Map();\r\n this.isProcessing = false;\r\n this.pendingComputed = new Set();\r\n this.persistedKeys = new Map();\r\n this.snapshots = [];\r\n this.snapshotLimit = 10;\r\n this._proxyCache = new WeakMap();\r\n \r\n this.createReactiveData();\r\n }\r\n\r\n createReactiveData() {\r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, key);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = this.resolvePath(target, key);\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = this.resolvePath(target, key);\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n }\r\n };\r\n\r\n this.data = new Proxy(this.rawData, handler);\r\n this.data.__parent__ = null;\r\n this.data.__path__ = '';\r\n }\r\n\r\n wrapReactive(obj, parentKey) {\r\n if (obj[REACTIVE_SYMBOLS.isReactive]) return obj;\r\n \r\n if (this._proxyCache.has(obj)) {\r\n return this._proxyCache.get(obj);\r\n }\r\n \r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n if (key === REACTIVE_SYMBOLS.parent || key === '__parent__') return target[REACTIVE_SYMBOLS.parent];\r\n if (key === REACTIVE_SYMBOLS.path || key === '__path__') return target[REACTIVE_SYMBOLS.path];\r\n if (key === REACTIVE_SYMBOLS.isReactive || key === '__isReactive__') return true;\r\n \r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return false;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n },\r\n has: (target, key) => {\r\n if (key === '__raw__' || \r\n key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n return key in target;\r\n },\r\n ownKeys: (target) => {\r\n return Reflect.ownKeys(target).filter(key => \r\n key !== REACTIVE_SYMBOLS.parent && \r\n key !== REACTIVE_SYMBOLS.path && \r\n key !== REACTIVE_SYMBOLS.isReactive\r\n );\r\n },\r\n getOwnPropertyDescriptor: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: target[key]\r\n };\r\n }\r\n return Reflect.getOwnPropertyDescriptor(target, key);\r\n }\r\n };\r\n \r\n const proxy = new Proxy(obj, handler);\r\n obj[REACTIVE_SYMBOLS.parent] = obj;\r\n obj[REACTIVE_SYMBOLS.path] = parentKey;\r\n obj[REACTIVE_SYMBOLS.isReactive] = true;\r\n this._proxyCache.set(obj, proxy);\r\n \r\n Object.keys(obj).forEach(key => {\r\n if (obj[key] && typeof obj[key] === 'object' && !Array.isArray(obj[key])) {\r\n obj[key] = this.wrapReactive(obj[key], `${parentKey}${parentKey ? '.' : ''}${key}`);\r\n }\r\n });\r\n \r\n return proxy;\r\n }\r\n\r\n resolvePath(target, key) {\r\n if (target[REACTIVE_SYMBOLS.path]) {\r\n return `${target[REACTIVE_SYMBOLS.path]}.${key}`;\r\n }\r\n return key;\r\n }\r\n\r\n queueUpdate(key, value) {\r\n this.updateQueue.set(key, value);\r\n \r\n if (!this.isProcessing) {\r\n this.isProcessing = true;\r\n requestAnimationFrame(() => {\r\n this.processQueue();\r\n });\r\n }\r\n }\r\n\r\n processQueue() {\r\n const updatedKeys = new Set();\r\n \r\n this.updateQueue.forEach((value, key) => {\r\n updatedKeys.add(key);\r\n this.updateElementsDirect(key, value);\r\n \r\n const subKeys = this.pathTrie.getSubKeys(key);\r\n subKeys.forEach(subKey => {\r\n if (!updatedKeys.has(subKey)) {\r\n const subValue = this.get(subKey);\r\n this.updateElementsDirect(subKey, subValue);\r\n updatedKeys.add(subKey);\r\n }\r\n });\r\n });\r\n \r\n this.updateQueue.clear();\r\n this.processComputed();\r\n this.isProcessing = false;\r\n }\r\n\r\n updateElementsDirect(key, value) {\r\n if (this.elements[key]) {\r\n this.elements[key].forEach(element => {\r\n this.updateElement(element, value);\r\n });\r\n }\r\n }\r\n\r\n processComputed() {\r\n const computedKeys = Object.keys(this.computedProperties);\r\n \r\n computedKeys.forEach(name => {\r\n const prop = this.computedProperties[name];\r\n const depsChanged = prop.deps.some(dep => {\r\n return this.updateQueue.has(dep) || \r\n this.pathTrie.getSubKeys(dep).some(k => this.updateQueue.has(k));\r\n });\r\n \r\n if (depsChanged) {\r\n this.updateComputedProperty(name);\r\n }\r\n });\r\n }\r\n\r\n set(key, value, silent = false) {\r\n const oldValue = this.get(key);\r\n \r\n if (typeof key === 'object') {\r\n Object.assign(this.rawData, key);\r\n Object.keys(key).forEach(k => {\r\n if (!silent) {\r\n this.notify(k, key[k], oldValue?.[k]);\r\n this.queueUpdate(k, key[k]);\r\n }\r\n });\r\n } else {\r\n if (key.includes('.')) {\r\n this.setNested(key, value);\r\n } else {\r\n this.rawData[key] = value;\r\n }\r\n \r\n if (!silent) {\r\n this.notify(key, value, oldValue);\r\n this.queueUpdate(key, value);\r\n }\r\n }\r\n \r\n if (!silent) {\r\n this.processComputed();\r\n }\r\n }\r\n\r\n get(key) {\r\n if (!key) return undefined;\r\n if (key.includes('.')) {\r\n return this.getNested(key);\r\n }\r\n return this.rawData[key];\r\n }\r\n\r\n getNested(path) {\r\n if (!path) return undefined;\r\n return path.split('.').reduce((obj, key) => obj?.[key], this.rawData);\r\n }\r\n\r\n setNested(path, value) {\r\n const keys = path.split('.');\r\n const lastKey = keys.pop();\r\n const parent = keys.reduce((obj, key) => {\r\n if (!obj[key]) obj[key] = {};\r\n return obj[key];\r\n }, this.rawData);\r\n \r\n const oldValue = parent[lastKey];\r\n parent[lastKey] = value;\r\n this.notify(path, value, oldValue);\r\n this.queueUpdate(path, value);\r\n }\r\n\r\n observe(key, callback) {\r\n if (!this.observers[key]) {\r\n this.observers[key] = [];\r\n }\r\n this.observers[key].push(callback);\r\n }\r\n\r\n unobserve(key, callback) {\r\n if (this.observers[key]) {\r\n this.observers[key] = this.observers[key].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n notify(key, value, oldValue) {\r\n if (this.observers[key]) {\r\n this.observers[key].forEach(callback => {\r\n try {\r\n callback(value, oldValue);\r\n } catch (e) {\r\n console.error(`Observer error for ${key}:`, e);\r\n }\r\n });\r\n }\r\n \r\n this.observers['*']?.forEach(callback => {\r\n try {\r\n callback(key, value, oldValue);\r\n } catch (e) {\r\n console.error('Wildcard observer error:', e);\r\n }\r\n });\r\n }\r\n\r\n updateElement(element, value) {\r\n const binding = element.getAttribute('data-bind');\r\n if (!binding) return;\r\n\r\n const bindings = binding.split('|');\r\n \r\n bindings.forEach(b => {\r\n const parts = b.split(':');\r\n const type = parts[0].trim();\r\n const target = parts[1]?.trim();\r\n\r\n switch (type) {\r\n case 'text':\r\n if (element.textContent !== String(value ?? '')) {\r\n element.textContent = value ?? '';\r\n }\r\n break;\r\n case 'html':\r\n if (element.innerHTML !== String(value ?? '')) {\r\n element.innerHTML = value ?? '';\r\n }\r\n break;\r\n case 'value':\r\n if (element.type === 'checkbox') {\r\n if (element.checked !== !!value) {\r\n element.checked = !!value;\r\n }\r\n } else if (element.value !== String(value ?? '')) {\r\n element.value = value ?? '';\r\n }\r\n break;\r\n case 'checked':\r\n if (element.checked !== !!value) {\r\n element.checked = !!value;\r\n }\r\n break;\r\n case 'disabled':\r\n if (element.disabled !== !!value) {\r\n element.disabled = !!value;\r\n }\r\n break;\r\n case 'hidden':\r\n const display = value ? 'none' : '';\r\n if (element.style.display !== display) {\r\n element.style.display = display;\r\n }\r\n break;\r\n case 'class':\r\n if (target) {\r\n if (value) {\r\n element.classList.add(target);\r\n } else {\r\n element.classList.remove(target);\r\n }\r\n }\r\n break;\r\n case 'style':\r\n if (target && element.style[target] !== String(value ?? '')) {\r\n element.style[target] = value ?? '';\r\n }\r\n break;\r\n case 'attr':\r\n if (target) {\r\n const current = element.getAttribute(target);\r\n if (current !== String(value ?? '')) {\r\n element.setAttribute(target, value ?? '');\r\n }\r\n }\r\n break;\r\n case 'src':\r\n if (element.src !== String(value ?? '')) {\r\n element.src = value ?? '';\r\n }\r\n break;\r\n case 'href':\r\n if (element.href !== String(value ?? '')) {\r\n element.href = value ?? '';\r\n }\r\n break;\r\n case 'placeholder':\r\n if (element.placeholder !== String(value ?? '')) {\r\n element.placeholder = value ?? '';\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n\r\n computed(name, deps, callback) {\r\n this.computedProperties[name] = { deps, callback };\r\n \r\n deps.forEach(dep => {\r\n this.pathTrie.insert(dep);\r\n });\r\n \r\n this.updateComputedProperty(name);\r\n }\r\n\r\n updateComputedProperty(name) {\r\n const prop = this.computedProperties[name];\r\n if (!prop) return;\r\n \r\n try {\r\n const values = prop.deps.map(dep => this.get(dep));\r\n const result = prop.callback(...values);\r\n this.set(name, result, true);\r\n } catch (e) {\r\n console.error(`Computed error for ${name}:`, e);\r\n }\r\n }\r\n\r\n load(data) {\r\n Object.keys(data).forEach(key => {\r\n if (data[key] && typeof data[key] === 'object' && !Array.isArray(data[key])) {\r\n this.rawData[key] = this.wrapReactive(data[key], key);\r\n } else {\r\n this.rawData[key] = data[key];\r\n }\r\n this.queueUpdate(key, this.rawData[key]);\r\n });\r\n \r\n this.processComputed();\r\n }\r\n\r\n reset() {\r\n this.rawData = {};\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue.clear();\r\n this.snapshots = [];\r\n this.createReactiveData();\r\n this.bind();\r\n }\r\n\r\n persist(key, options = {}) {\r\n const {\r\n storage: storageType = 'local',\r\n debounce = 0,\r\n version = 1,\r\n encrypt = false,\r\n encryptionKey = null\r\n } = options;\r\n\r\n const storage = storageType === 'session' ? sessionStorage : localStorage;\r\n \r\n this.persistedKeys.set(key, { \r\n storage, \r\n debounce, \r\n timeout: null,\r\n version,\r\n encrypt,\r\n encryptionKey\r\n });\r\n \r\n const value = this.get(key);\r\n if (value !== undefined) {\r\n this._persistSave(key, value, storage, { version, encrypt, encryptionKey });\r\n }\r\n \r\n this.observe(key, (newValue) => {\r\n const config = this.persistedKeys.get(key);\r\n if (!config) return;\r\n \r\n if (config.debounce > 0) {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n config.timeout = setTimeout(() => {\r\n this._persistSave(key, newValue, config.storage, { \r\n version: config.version, \r\n encrypt: config.encrypt, \r\n encryptionKey: config.encryptionKey \r\n });\r\n }, config.debounce);\r\n } else {\r\n this._persistSave(key, newValue, config.storage, { \r\n version: config.version, \r\n encrypt: config.encrypt, \r\n encryptionKey: config.encryptionKey \r\n });\r\n }\r\n });\r\n }\r\n\r\n _persistSave(key, value, storage, options = {}) {\r\n try {\r\n const { version = 1, encrypt = false, encryptionKey = null } = options;\r\n \r\n const dataToStore = {\r\n value,\r\n version,\r\n timestamp: Date.now()\r\n };\r\n \r\n let serialized = JSON.stringify(dataToStore);\r\n \r\n if (encrypt && encryptionKey) {\r\n serialized = this._encrypt(serialized, encryptionKey);\r\n }\r\n \r\n this._ensureStorageCapacity(storage);\r\n storage.setItem(`kupola:${key}`, serialized);\r\n } catch (e) {\r\n console.warn(`Failed to persist key ${key}:`, e);\r\n \r\n if (e.name === 'QuotaExceededError' && storage === localStorage) {\r\n console.warn(`localStorage quota exceeded, trying sessionStorage for key ${key}`);\r\n try {\r\n sessionStorage.setItem(`kupola:${key}`, JSON.stringify({ value, version: 1 }));\r\n } catch (e2) {\r\n console.warn(`sessionStorage also failed for key ${key}:`, e2);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _ensureStorageCapacity(storage) {\r\n try {\r\n const testKey = `kupola:__storage_test__`;\r\n storage.setItem(testKey, 'test');\r\n storage.removeItem(testKey);\r\n } catch (e) {\r\n if (e.name === 'QuotaExceededError') {\r\n this._cleanupOldStorage(storage);\r\n }\r\n }\r\n }\r\n\r\n _cleanupOldStorage(storage) {\r\n const now = Date.now();\r\n const maxAge = 30 * 24 * 60 * 60 * 1000;\r\n \r\n for (let i = 0; i < storage.length; i++) {\r\n const key = storage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n try {\r\n const data = JSON.parse(storage.getItem(key));\r\n if (data.timestamp && now - data.timestamp > maxAge) {\r\n storage.removeItem(key);\r\n }\r\n } catch (e) {\r\n storage.removeItem(key);\r\n }\r\n }\r\n }\r\n }\r\n\r\n _encrypt(text, key) {\r\n if (!window.CryptoJS) {\r\n console.warn('CryptoJS not available, encryption skipped');\r\n return text;\r\n }\r\n return window.CryptoJS.AES.encrypt(text, key).toString();\r\n }\r\n\r\n _decrypt(ciphertext, key) {\r\n if (!window.CryptoJS) {\r\n console.warn('CryptoJS not available, decryption skipped');\r\n return ciphertext;\r\n }\r\n try {\r\n const bytes = window.CryptoJS.AES.decrypt(ciphertext, key);\r\n return bytes.toString(window.CryptoJS.enc.Utf8);\r\n } catch (e) {\r\n console.warn('Decryption failed:', e);\r\n return ciphertext;\r\n }\r\n }\r\n\r\n unpersist(key) {\r\n const config = this.persistedKeys.get(key);\r\n if (config) {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n config.storage.removeItem(`kupola:${key}`);\r\n this.persistedKeys.delete(key);\r\n }\r\n }\r\n\r\n loadPersisted(options = {}) {\r\n const persisted = {};\r\n const { encryptionKey = null } = options;\r\n \r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n const dataKey = key.replace('kupola:', '');\r\n try {\r\n const stored = localStorage.getItem(key);\r\n let parsed;\r\n \r\n if (encryptionKey) {\r\n const decrypted = this._decrypt(stored, encryptionKey);\r\n parsed = JSON.parse(decrypted);\r\n } else {\r\n parsed = JSON.parse(stored);\r\n }\r\n \r\n if (parsed.version !== undefined && parsed.version !== options.version) {\r\n console.debug(`Skipping outdated data for ${dataKey} (version ${parsed.version})`);\r\n continue;\r\n }\r\n \r\n persisted[dataKey] = parsed.value !== undefined ? parsed.value : parsed;\r\n } catch (e) {\r\n console.warn(`Failed to load persisted key ${dataKey}:`, e);\r\n }\r\n }\r\n }\r\n \r\n for (let i = 0; i < sessionStorage.length; i++) {\r\n const key = sessionStorage.key(i);\r\n if (key?.startsWith('kupola:')) {\r\n const dataKey = key.replace('kupola:', '');\r\n try {\r\n const stored = sessionStorage.getItem(key);\r\n let parsed;\r\n \r\n if (encryptionKey) {\r\n const decrypted = this._decrypt(stored, encryptionKey);\r\n parsed = JSON.parse(decrypted);\r\n } else {\r\n parsed = JSON.parse(stored);\r\n }\r\n \r\n if (parsed.version !== undefined && parsed.version !== options.version) {\r\n console.debug(`Skipping outdated data for ${dataKey} (version ${parsed.version})`);\r\n continue;\r\n }\r\n \r\n persisted[dataKey] = parsed.value !== undefined ? parsed.value : parsed;\r\n } catch (e) {}\r\n }\r\n }\r\n \r\n if (Object.keys(persisted).length > 0) {\r\n this.load(persisted);\r\n }\r\n \r\n return persisted;\r\n }\r\n\r\n _clone(data) {\r\n if (typeof structuredClone === 'function') {\r\n try {\r\n return structuredClone(data);\r\n } catch (e) {\r\n console.warn('structuredClone failed, falling back to JSON:', e);\r\n }\r\n }\r\n return JSON.parse(JSON.stringify(data));\r\n }\r\n\r\n snapshot() {\r\n const snapshot = this._clone(this.rawData);\r\n this.snapshots.push(snapshot);\r\n if (this.snapshots.length > this.snapshotLimit) {\r\n this.snapshots.shift();\r\n }\r\n return this.snapshots.length - 1;\r\n }\r\n\r\n rollback(index = -1) {\r\n if (this.snapshots.length === 0) return false;\r\n \r\n const snapshotIndex = index >= 0 ? index : this.snapshots.length - 1;\r\n const snapshot = this.snapshots[snapshotIndex];\r\n \r\n if (!snapshot) return false;\r\n \r\n this.rawData = this._clone(snapshot);\r\n this.createReactiveData();\r\n \r\n Object.keys(this.rawData).forEach(key => {\r\n this.queueUpdate(key, this.rawData[key]);\r\n });\r\n \r\n this.processComputed();\r\n return true;\r\n }\r\n\r\n getSnapshotCount() {\r\n return this.snapshots.length;\r\n }\r\n\r\n clearSnapshots() {\r\n this.snapshots = [];\r\n }\r\n\r\n serializeForm(formElement) {\r\n const data = {};\r\n \r\n formElement.querySelectorAll('input, select, textarea').forEach(element => {\r\n const name = element.getAttribute('data-bind');\r\n if (!name) return;\r\n \r\n const parts = name.split(':');\r\n const key = parts[1]?.trim();\r\n if (!key) return;\r\n \r\n if (element.type === 'checkbox') {\r\n if (!data[key]) data[key] = [];\r\n if (element.checked) {\r\n data[key].push(element.value);\r\n }\r\n } else if (element.type === 'radio') {\r\n if (element.checked) {\r\n data[key] = element.value;\r\n }\r\n } else {\r\n data[key] = element.value;\r\n }\r\n });\r\n \r\n return data;\r\n }\r\n\r\n fillForm(formElement, data) {\r\n Object.keys(data).forEach(key => {\r\n formElement.querySelectorAll('[data-bind*=\":' + key + '\"]').forEach(element => {\r\n if (element.type === 'checkbox') {\r\n element.checked = Array.isArray(data[key]) \r\n ? data[key].includes(element.value) \r\n : !!data[key];\r\n } else if (element.type === 'radio') {\r\n element.checked = element.value === data[key];\r\n } else {\r\n element.value = data[key] ?? '';\r\n }\r\n });\r\n });\r\n }\r\n\r\n createReactive(target, path = '') {\r\n if (target[REACTIVE_SYMBOLS.isReactive]) return target;\r\n \r\n if (this._proxyCache.has(target)) {\r\n return this._proxyCache.get(target);\r\n }\r\n \r\n const handler = {\r\n get: (target, key, receiver) => {\r\n if (key === '__raw__') return target;\r\n if (key === REACTIVE_SYMBOLS.parent || key === '__parent__') return target[REACTIVE_SYMBOLS.parent];\r\n if (key === REACTIVE_SYMBOLS.path || key === '__path__') return target[REACTIVE_SYMBOLS.path];\r\n if (key === REACTIVE_SYMBOLS.isReactive || key === '__isReactive__') return true;\r\n \r\n const result = Reflect.get(target, key, receiver);\r\n if (result && typeof result === 'object' && !Array.isArray(result)) {\r\n return this.wrapReactive(result, `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`);\r\n }\r\n return result;\r\n },\r\n set: (target, key, value, receiver) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key, receiver);\r\n const result = Reflect.set(target, key, value, receiver);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, value, oldValue);\r\n this.queueUpdate(fullPath, value);\r\n \r\n return result;\r\n },\r\n deleteProperty: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return false;\r\n }\r\n \r\n const oldValue = Reflect.get(target, key);\r\n const result = Reflect.deleteProperty(target, key);\r\n \r\n const fullPath = `${target[REACTIVE_SYMBOLS.path]}${target[REACTIVE_SYMBOLS.path] ? '.' : ''}${key}`;\r\n this.notify(fullPath, undefined, oldValue);\r\n this.queueUpdate(fullPath, undefined);\r\n \r\n return result;\r\n },\r\n has: (target, key) => {\r\n if (key === '__raw__' || \r\n key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive ||\r\n key === '__parent__' ||\r\n key === '__path__' ||\r\n key === '__isReactive__') {\r\n return true;\r\n }\r\n return key in target;\r\n },\r\n ownKeys: (target) => {\r\n return Reflect.ownKeys(target).filter(key => \r\n key !== REACTIVE_SYMBOLS.parent && \r\n key !== REACTIVE_SYMBOLS.path && \r\n key !== REACTIVE_SYMBOLS.isReactive\r\n );\r\n },\r\n getOwnPropertyDescriptor: (target, key) => {\r\n if (key === REACTIVE_SYMBOLS.parent || \r\n key === REACTIVE_SYMBOLS.path || \r\n key === REACTIVE_SYMBOLS.isReactive) {\r\n return {\r\n configurable: false,\r\n enumerable: false,\r\n writable: false,\r\n value: target[key]\r\n };\r\n }\r\n return Reflect.getOwnPropertyDescriptor(target, key);\r\n }\r\n };\r\n \r\n const proxy = new Proxy(target, handler);\r\n target[REACTIVE_SYMBOLS.parent] = target;\r\n target[REACTIVE_SYMBOLS.path] = path;\r\n target[REACTIVE_SYMBOLS.isReactive] = true;\r\n this._proxyCache.set(target, proxy);\r\n \r\n Object.keys(target).forEach(key => {\r\n if (target[key] && typeof target[key] === 'object' && !Array.isArray(target[key])) {\r\n target[key] = this.wrapReactive(target[key], `${path}${path ? '.' : ''}${key}`);\r\n }\r\n });\r\n \r\n return proxy;\r\n }\r\n\r\n bind() {\r\n document.querySelectorAll('[data-bind]').forEach(element => {\r\n this._bindElement(element);\r\n });\r\n \r\n if (!this._mutationObserver) {\r\n this._mutationObserver = new MutationObserver((mutations) => {\r\n mutations.forEach(mutation => {\r\n mutation.addedNodes.forEach(node => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const bindElements = node.querySelectorAll('[data-bind]');\r\n bindElements.forEach(element => this._bindElement(element));\r\n if (node.hasAttribute && node.hasAttribute('data-bind')) {\r\n this._bindElement(node);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n \r\n this._mutationObserver.observe(document.body, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n }\r\n\r\n _bindElement(element) {\r\n const binding = element.getAttribute('data-bind');\r\n const parts = binding.split(':');\r\n const typePart = parts[0].split('|')[0].trim();\r\n const key = parts[1]?.trim();\r\n \r\n if (!key) return;\r\n \r\n this.pathTrie.insert(key);\r\n \r\n if (!this.elements[key]) {\r\n this.elements[key] = [];\r\n }\r\n \r\n if (!this.elements[key].includes(element)) {\r\n this.elements[key].push(element);\r\n }\r\n \r\n if (element.tagName === 'INPUT' || element.tagName === 'TEXTAREA' || element.tagName === 'SELECT') {\r\n const existingHandler = element.__kupolaBindHandler;\r\n if (existingHandler) {\r\n element.removeEventListener('input', existingHandler);\r\n }\r\n \r\n const handler = () => {\r\n const value = element.type === 'checkbox' ? element.checked : element.value;\r\n if (key.includes('.')) {\r\n this.setNested(key, value);\r\n } else {\r\n this.set(key, value);\r\n }\r\n };\r\n \r\n element.__kupolaBindHandler = handler;\r\n element.addEventListener('input', handler);\r\n }\r\n \r\n if (this.rawData[key] !== undefined) {\r\n this.updateElement(element, this.rawData[key]);\r\n }\r\n }\r\n\r\n destroy() {\r\n if (this._mutationObserver) {\r\n this._mutationObserver.disconnect();\r\n this._mutationObserver = null;\r\n }\r\n \r\n Object.values(this.elements).forEach(elements => {\r\n elements.forEach(element => {\r\n const handler = element.__kupolaBindHandler;\r\n if (handler) {\r\n element.removeEventListener('input', handler);\r\n delete element.__kupolaBindHandler;\r\n }\r\n });\r\n });\r\n \r\n this.persistedKeys.forEach((config, key) => {\r\n if (config.timeout) clearTimeout(config.timeout);\r\n });\r\n this.persistedKeys.clear();\r\n \r\n this.rawData = {};\r\n this.observers = {};\r\n this.elements = {};\r\n this.computedProperties = {};\r\n this.pathTrie = new PathTrie();\r\n this.updateQueue.clear();\r\n this.snapshots = [];\r\n }\r\n}\r\n\r\nclass KupolaStore {\r\n constructor(name, options = {}) {\r\n this.name = name;\r\n this._stateKey = `__store_${name}__`;\r\n \r\n const initialState = options.state ? options.state() : {};\r\n this.getters = options.getters || {};\r\n this.actions = options.actions || {};\r\n this.mutations = options.mutations || {};\r\n \r\n this.observers = {};\r\n \r\n if (window.kupolaData) {\r\n window.kupolaData.set(this._stateKey, initialState);\r\n this.state = window.kupolaData.data?.[this._stateKey] || \r\n window.kupolaData.createReactive(initialState, this._stateKey);\r\n \r\n window.kupolaData.observe(this._stateKey, (newState) => {\r\n this.notify(newState);\r\n });\r\n } else {\r\n this.state = initialState;\r\n }\r\n \r\n this._bindGetters();\r\n this._bindActions();\r\n }\r\n\r\n _bindGetters() {\r\n Object.keys(this.getters).forEach(name => {\r\n Object.defineProperty(this, name, {\r\n get: () => this.getters[name](this.state),\r\n enumerable: true\r\n });\r\n });\r\n }\r\n\r\n _bindActions() {\r\n Object.keys(this.actions).forEach(name => {\r\n this[name] = (...args) => {\r\n return this.actions[name]({\r\n state: this.state,\r\n commit: this.commit.bind(this),\r\n dispatch: this.dispatch.bind(this),\r\n getters: this\r\n }, ...args);\r\n };\r\n });\r\n }\r\n\r\n commit(type, payload) {\r\n const mutation = this.mutations[type];\r\n if (!mutation) {\r\n console.warn(`Mutation ${type} not found in store ${this.name}`);\r\n return;\r\n }\r\n \r\n mutation(this.state, payload);\r\n }\r\n\r\n dispatch(type, payload) {\r\n const action = this.actions[type];\r\n if (!action) {\r\n console.warn(`Action ${type} not found in store ${this.name}`);\r\n return;\r\n }\r\n \r\n return action({\r\n state: this.state,\r\n commit: this.commit.bind(this),\r\n dispatch: this.dispatch.bind(this),\r\n getters: this\r\n }, payload);\r\n }\r\n\r\n observe(callback) {\r\n if (!this.observers['*']) {\r\n this.observers['*'] = [];\r\n }\r\n this.observers['*'].push(callback);\r\n return callback;\r\n }\r\n\r\n unobserve(callback) {\r\n if (this.observers['*']) {\r\n this.observers['*'] = this.observers['*'].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n notify(newState) {\r\n if (this.observers['*']) {\r\n this.observers['*'].forEach(callback => {\r\n try {\r\n callback(newState);\r\n } catch (e) {\r\n console.error(`Observer error for store ${this.name}:`, e);\r\n }\r\n });\r\n }\r\n \r\n if (window.kupolaData) {\r\n window.kupolaData.set(this.name, newState);\r\n }\r\n }\r\n\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n state: this.state,\r\n getters: Object.keys(this.getters).reduce((acc, name) => {\r\n acc[name] = this[name];\r\n return acc;\r\n }, {})\r\n };\r\n }\r\n}\r\n\r\nclass KupolaStoreManager {\r\n constructor() {\r\n this.stores = new Map();\r\n }\r\n\r\n createStore(name, options) {\r\n const store = new KupolaStore(name, options);\r\n this.stores.set(name, store);\r\n return store;\r\n }\r\n\r\n getStore(name) {\r\n return this.stores.get(name);\r\n }\r\n\r\n registerStore(store) {\r\n if (store instanceof KupolaStore) {\r\n this.stores.set(store.name, store);\r\n }\r\n }\r\n\r\n dispose() {\r\n this.stores.clear();\r\n }\r\n}\r\n\r\nclass KupolaEventBus {\r\n constructor() {\r\n this.events = {};\r\n this.delegatedEvents = {};\r\n this.eventListeners = {};\r\n }\r\n\r\n on(eventName, callback) {\r\n if (!this.events[eventName]) {\r\n this.events[eventName] = [];\r\n }\r\n this.events[eventName].push(callback);\r\n return callback;\r\n }\r\n\r\n off(eventName, callback) {\r\n if (this.events[eventName]) {\r\n this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);\r\n }\r\n }\r\n\r\n emit(eventName, data) {\r\n if (this.events[eventName]) {\r\n this.events[eventName].forEach(callback => {\r\n try {\r\n callback(data);\r\n } catch (e) {\r\n console.error(`Error in event handler for ${eventName}:`, e);\r\n }\r\n });\r\n }\r\n \r\n this.events['*']?.forEach(callback => {\r\n try {\r\n callback(eventName, data);\r\n } catch (e) {\r\n console.error(`Error in wildcard event handler:`, e);\r\n }\r\n });\r\n }\r\n\r\n once(eventName, callback) {\r\n const onceCallback = (data) => {\r\n callback(data);\r\n this.off(eventName, onceCallback);\r\n };\r\n this.on(eventName, onceCallback);\r\n return onceCallback;\r\n }\r\n\r\n delegate(selector, eventName, callback) {\r\n if (!this.delegatedEvents[eventName]) {\r\n this.delegatedEvents[eventName] = [];\r\n \r\n const listener = (e) => {\r\n this.delegatedEvents[eventName].forEach(({ selector: sel, cb }) => {\r\n if (e.target.matches(sel) || e.target.closest(sel)) {\r\n cb(e);\r\n }\r\n });\r\n };\r\n \r\n document.addEventListener(eventName, listener);\r\n this.eventListeners[eventName] = listener;\r\n }\r\n \r\n this.delegatedEvents[eventName].push({ selector, cb: callback });\r\n return callback;\r\n }\r\n\r\n undelegate(selector, eventName) {\r\n if (this.delegatedEvents[eventName]) {\r\n this.delegatedEvents[eventName] = this.delegatedEvents[eventName].filter(\r\n item => item.selector !== selector\r\n );\r\n \r\n if (this.delegatedEvents[eventName].length === 0) {\r\n const listener = this.eventListeners[eventName];\r\n if (listener) {\r\n document.removeEventListener(eventName, listener);\r\n delete this.eventListeners[eventName];\r\n }\r\n delete this.delegatedEvents[eventName];\r\n }\r\n }\r\n }\r\n\r\n destroy() {\r\n Object.entries(this.eventListeners).forEach(([eventName, listener]) => {\r\n document.removeEventListener(eventName, listener);\r\n });\r\n \r\n this.events = {};\r\n this.delegatedEvents = {};\r\n this.eventListeners = {};\r\n }\r\n}\r\n\r\nconst kupolaData = new KupolaDataBind();\r\nconst kupolaEvents = new KupolaEventBus();\r\nconst kupolaStoreManager = new KupolaStoreManager();\r\n\r\nfunction createStore(name, options) {\r\n return kupolaStoreManager.createStore(name, options);\r\n}\r\n\r\nfunction getStore(name) {\r\n return kupolaStoreManager.getStore(name);\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n kupolaData.loadPersisted();\r\n kupolaData.bind();\r\n});\r\n\r\nwindow.KupolaDataBind = KupolaDataBind;\r\nwindow.KupolaEventBus = KupolaEventBus;\r\nwindow.KupolaStore = KupolaStore;\r\nwindow.KupolaStoreManager = KupolaStoreManager;\r\nwindow.kupolaData = kupolaData;\r\nwindow.kupolaEvents = kupolaEvents;\r\nwindow.kupolaStoreManager = kupolaStoreManager;\r\nwindow.createStore = createStore;\r\nwindow.getStore = getStore;\r\n","const THEME_KEY = 'kupola-theme';\r\nconst BRAND_KEY = 'kupola-brand';\r\n\r\nconst BRAND_OPTIONS = [\r\n { id: 'green', name: '翠绿', color: '#32F08C' },\r\n { id: 'xionghuang', name: '雄黄', color: '#FF9900' },\r\n { id: 'jianghuang', name: '姜黄', color: '#E2C027' },\r\n { id: 'lanlv', name: '蓝绿', color: '#12A182' },\r\n { id: 'kongquelan', name: '孔雀蓝', color: '#0EB0C9' },\r\n { id: 'meiguizi', name: '玫瑰紫', color: '#BA2F7B' },\r\n { id: 'shihong', name: '柿红', color: '#F2481B' },\r\n { id: 'quhong', name: '紫云', color: '#B1A6CC' },\r\n { id: 'shanchahong', name: '山茶红', color: '#F05A46' },\r\n { id: 'zengqing', name: '曾青', color: '#535164' },\r\n { id: 'roulan', name: '柔蓝', color: '#106898' }\r\n];\r\n\r\nfunction getTheme() {\r\n return localStorage.getItem(THEME_KEY) || 'dark';\r\n}\r\n\r\nfunction setTheme(theme) {\r\n if (theme !== 'dark' && theme !== 'light') return;\r\n \r\n document.documentElement.setAttribute('data-theme', theme);\r\n localStorage.setItem(THEME_KEY, theme);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.setAttribute('data-current-theme', theme);\r\n const icon = toggleBtn.querySelector('.theme-icon');\r\n if (icon) {\r\n const iconPath = icon.src.substring(0, icon.src.lastIndexOf('/') + 1);\r\n icon.src = theme === 'dark' \r\n ? iconPath + 'sun.svg' \r\n : iconPath + 'moon.svg';\r\n }\r\n }\r\n}\r\n\r\nfunction getBrand() {\r\n return localStorage.getItem(BRAND_KEY) || 'zengqing';\r\n}\r\n\r\nfunction setBrand(brandId) {\r\n const brand = BRAND_OPTIONS.find(b => b.id === brandId);\r\n if (!brand) return;\r\n \r\n document.documentElement.setAttribute('data-brand', brandId);\r\n localStorage.setItem(BRAND_KEY, brandId);\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n if (brandToggle) {\r\n brandToggle.setAttribute('data-current-brand', brandId);\r\n const brandIcon = brandToggle.querySelector('.brand-icon');\r\n if (brandIcon) {\r\n brandIcon.style.backgroundColor = brand.color;\r\n }\r\n const brandName = brandToggle.querySelector('.brand-name');\r\n if (brandName) {\r\n brandName.textContent = brand.name;\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n if (btn.getAttribute('data-brand-btn') === brandId) {\r\n btn.classList.add('is-active');\r\n } else {\r\n btn.classList.remove('is-active');\r\n }\r\n });\r\n}\r\n\r\nfunction initTheme() {\r\n \r\n const savedTheme = getTheme();\r\n setTheme(savedTheme);\r\n \r\n const savedBrand = getBrand();\r\n setBrand(savedBrand);\r\n \r\n const toggleBtn = document.querySelector('[data-theme-toggle]');\r\n if (toggleBtn) {\r\n toggleBtn.addEventListener('click', () => {\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n });\r\n }\r\n \r\n let brandPicker = document.getElementById('brand-picker');\r\n if (!brandPicker) {\r\n brandPicker = document.createElement('div');\r\n brandPicker.id = 'brand-picker';\r\n brandPicker.style.position = 'fixed';\r\n brandPicker.style.top = '64px';\r\n brandPicker.style.right = '16px';\r\n brandPicker.style.zIndex = '9998';\r\n brandPicker.style.display = 'none';\r\n brandPicker.style.padding = '12px';\r\n brandPicker.style.width = '200px';\r\n brandPicker.style.gridTemplateColumns = 'repeat(3, 1fr)';\r\n brandPicker.style.gap = '6px';\r\n brandPicker.style.backgroundColor = 'var(--bg-base-secondary)';\r\n brandPicker.style.border = '1px solid var(--border-neutral-l1)';\r\n brandPicker.style.borderRadius = '8px';\r\n brandPicker.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.2)';\r\n brandPicker.style.overflow = 'hidden';\r\n \r\n BRAND_OPTIONS.forEach(brand => {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-brand-btn', brand.id);\r\n btn.style.display = 'flex';\r\n btn.style.justifyContent = 'center';\r\n btn.style.alignItems = 'center';\r\n btn.style.height = '60px';\r\n btn.style.backgroundColor = brand.color;\r\n btn.style.color = ['#32F08C', '#FF9900', '#E2C027', '#0EB0C9', '#B1A6CC'].includes(brand.color) ? '#0C0C0D' : '#FFFFFF';\r\n btn.style.fontWeight = '500';\r\n btn.style.borderRadius = '4px';\r\n btn.style.border = 'none';\r\n btn.style.cursor = 'pointer';\r\n btn.style.margin = '0';\r\n btn.style.padding = '0';\r\n btn.textContent = brand.name;\r\n brandPicker.appendChild(btn);\r\n });\r\n \r\n document.body.appendChild(brandPicker);\r\n }\r\n \r\n const brandToggle = document.querySelector('[data-brand-toggle]');\r\n \r\n if (brandToggle && brandPicker) {\r\n brandToggle.onclick = function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const isHidden = brandPicker.style.display === 'none';\r\n brandPicker.style.display = isHidden ? 'grid' : 'none';\r\n \r\n if (isHidden) {\r\n setTimeout(() => {\r\n document.addEventListener('click', closeBrandPicker, true);\r\n }, 0);\r\n } else {\r\n document.removeEventListener('click', closeBrandPicker, true);\r\n }\r\n };\r\n \r\n brandPicker.onclick = function(e) {\r\n e.stopPropagation();\r\n };\r\n }\r\n \r\n function closeBrandPicker(e) {\r\n if (brandPicker && brandToggle) {\r\n if (!brandPicker.contains(e.target) && !brandToggle.contains(e.target)) {\r\n brandPicker.style.display = 'none';\r\n document.removeEventListener('click', closeBrandPicker, true);\r\n }\r\n }\r\n }\r\n \r\n const brandButtons = document.querySelectorAll('[data-brand-btn]');\r\n \r\n brandButtons.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const brandId = btn.getAttribute('data-brand-btn');\r\n setBrand(brandId);\r\n if (brandPicker) {\r\n brandPicker.style.display = 'none';\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction createThemeToggle() {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-theme-toggle', '');\r\n btn.setAttribute('data-current-theme', getTheme());\r\n btn.className = 'ds-btn ds-btn--ghost ds-btn--sm ds-btn--icon';\r\n btn.style.position = 'fixed';\r\n btn.style.top = '16px';\r\n btn.style.right = '16px';\r\n btn.style.zIndex = '9999';\r\n \r\n const icon = document.createElement('img');\r\n icon.className = 'theme-icon';\r\n const scripts = document.getElementsByTagName('script');\r\n const currentScript = scripts[scripts.length - 1];\r\n const scriptPath = currentScript.src.substring(0, currentScript.src.lastIndexOf('/') + 1);\r\n icon.src = getTheme() === 'dark' \r\n ? scriptPath + '../icons/sun.svg' \r\n : scriptPath + '../icons/moon.svg';\r\n icon.width = 14;\r\n icon.height = 14;\r\n icon.alt = 'Toggle theme';\r\n \r\n btn.appendChild(icon);\r\n document.body.appendChild(btn);\r\n \r\n btn.addEventListener('click', () => {\r\n const currentTheme = getTheme();\r\n const newTheme = currentTheme === 'dark' ? 'light' : 'dark';\r\n setTheme(newTheme);\r\n });\r\n \r\n return btn;\r\n}\r\n\r\nfunction createBrandPicker() {\r\n const container = document.createElement('div');\r\n container.id = 'brand-picker-auto';\r\n container.style.position = 'fixed';\r\n container.style.top = '56px';\r\n container.style.right = '16px';\r\n container.style.zIndex = '9998';\r\n container.style.display = 'none';\r\n container.style.padding = '12px';\r\n container.style.width = '200px';\r\n container.style.gridTemplateColumns = 'repeat(3, 1fr)';\r\n container.style.gap = '6px';\r\n container.style.backgroundColor = 'var(--bg-base-secondary)';\r\n container.style.border = '1px solid var(--border-neutral-l1)';\r\n container.style.borderRadius = '8px';\r\n container.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.2)';\r\n container.style.overflow = 'hidden';\r\n \r\n BRAND_OPTIONS.forEach(brand => {\r\n const btn = document.createElement('button');\r\n btn.setAttribute('data-brand-btn', brand.id);\r\n btn.style.display = 'flex';\r\n btn.style.justifyContent = 'center';\r\n btn.style.alignItems = 'center';\r\n btn.style.height = '60px';\r\n btn.style.backgroundColor = brand.color;\r\n btn.style.color = ['#32F08C', '#FF9900', '#E2C027', '#0EB0C9', '#B1A6CC'].includes(brand.color) ? '#0C0C0D' : '#FFFFFF';\r\n btn.style.fontWeight = '500';\r\n btn.style.borderRadius = '4px';\r\n btn.style.border = 'none';\r\n btn.style.cursor = 'pointer';\r\n btn.style.margin = '0';\r\n btn.style.padding = '0';\r\n btn.textContent = brand.name;\r\n container.appendChild(btn);\r\n });\r\n \r\n document.body.appendChild(container);\r\n \r\n const toggleBtn = document.createElement('button');\r\n toggleBtn.setAttribute('data-brand-toggle', '');\r\n toggleBtn.setAttribute('data-current-brand', getBrand());\r\n toggleBtn.className = 'ds-btn ds-btn--ghost ds-btn--sm';\r\n toggleBtn.style.position = 'fixed';\r\n toggleBtn.style.top = '16px';\r\n toggleBtn.style.right = '56px';\r\n toggleBtn.style.zIndex = '9999';\r\n toggleBtn.style.display = 'flex';\r\n toggleBtn.style.alignItems = 'center';\r\n toggleBtn.style.gap = '6px';\r\n \r\n const brandIcon = document.createElement('span');\r\n brandIcon.className = 'brand-icon';\r\n brandIcon.style.width = '12px';\r\n brandIcon.style.height = '12px';\r\n brandIcon.style.borderRadius = '50%';\r\n brandIcon.style.backgroundColor = BRAND_OPTIONS.find(b => b.id === getBrand()).color;\r\n \r\n const brandName = document.createElement('span');\r\n brandName.className = 'brand-name';\r\n brandName.style.fontSize = '11px';\r\n brandName.textContent = BRAND_OPTIONS.find(b => b.id === getBrand()).name;\r\n \r\n toggleBtn.appendChild(brandIcon);\r\n toggleBtn.appendChild(brandName);\r\n document.body.appendChild(toggleBtn);\r\n \r\n toggleBtn.onclick = function(e) {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n const isHidden = container.style.display === 'none';\r\n container.style.display = isHidden ? 'grid' : 'none';\r\n \r\n if (isHidden) {\r\n setTimeout(() => {\r\n document.addEventListener('click', closeBrandPickerAuto, true);\r\n }, 0);\r\n } else {\r\n document.removeEventListener('click', closeBrandPickerAuto, true);\r\n }\r\n };\r\n \r\n container.onclick = function(e) {\r\n e.stopPropagation();\r\n };\r\n \r\n function closeBrandPickerAuto(e) {\r\n if (!container.contains(e.target) && !toggleBtn.contains(e.target)) {\r\n container.style.display = 'none';\r\n document.removeEventListener('click', closeBrandPickerAuto, true);\r\n }\r\n }\r\n \r\n const brandButtons = container.querySelectorAll('[data-brand-btn]');\r\n brandButtons.forEach(btn => {\r\n btn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n const brandId = btn.getAttribute('data-brand-btn');\r\n setBrand(brandId);\r\n container.style.display = 'none';\r\n });\r\n });\r\n \r\n return { toggleBtn, container };\r\n}\r\n\r\nfunction loadDevTools() {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const enabled = urlParams.has('dev') || urlParams.has('debug');\r\n \r\n if (!enabled) return;\r\n \r\n const themeScript = document.querySelector('script[src*=\"theme.js\"]');\r\n if (!themeScript || !themeScript.src) return;\r\n \r\n const scriptPath = themeScript.src.substring(0, themeScript.src.lastIndexOf('/') + 1);\r\n \r\n const devToolsScript = document.createElement('script');\r\n devToolsScript.src = scriptPath + 'kupola-devtools.js?v=15';\r\n devToolsScript.async = true;\r\n \r\n document.head.appendChild(devToolsScript);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { \r\n getTheme, setTheme, initTheme, createThemeToggle,\r\n getBrand, setBrand, BRAND_OPTIONS, createBrandPicker,\r\n loadDevTools\r\n };\r\n} else {\r\n if (!window.__kupolaThemeInitialized) {\r\n window.__kupolaThemeInitialized = true;\r\n \r\n function runInit() {\r\n initTheme();\r\n loadDevTools();\r\n }\r\n \r\n if (document.readyState === 'loading') {\r\n document.addEventListener('readystatechange', function readyStateHandler() {\r\n if (document.readyState !== 'loading') {\r\n document.removeEventListener('readystatechange', readyStateHandler);\r\n runInit();\r\n }\r\n });\r\n } else {\r\n setTimeout(runInit, 0);\r\n }\r\n }\r\n}","class Dropdown {\r\n constructor(element) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-dropdown__trigger');\r\n this.menu = element.querySelector('.ds-dropdown__menu');\r\n this.triggerText = this.trigger ? this.trigger.querySelector('span') : null;\r\n this.scope = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._itemClickHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.menu) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._itemClickHandler = (e) => {\r\n const item = e.currentTarget;\r\n if (this.triggerText) {\r\n this.triggerText.textContent = item.textContent.trim();\r\n }\r\n this.hideMenu();\r\n };\r\n\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n item.addEventListener('click', this._itemClickHandler);\r\n item._dropdownItemClickHandler = this._itemClickHandler;\r\n });\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.toggleMenu();\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hideMenu();\r\n }\r\n };\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.menu.style.display = 'none';\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n toggleMenu() {\r\n const isOpen = this.menu.style.display === 'block';\r\n this.menu.style.display = isOpen ? 'none' : 'block';\r\n this.element.classList.toggle('is-open', !isOpen);\r\n }\r\n\r\n hideMenu() {\r\n this.menu.style.display = 'none';\r\n this.element.classList.remove('is-open');\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.menu) {\r\n this.menu.querySelectorAll('.ds-dropdown__item').forEach(item => {\r\n if (item._dropdownItemClickHandler) {\r\n item.removeEventListener('click', item._dropdownItemClickHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._itemClickHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initDropdown(element) {\r\n const dropdown = new Dropdown(element);\r\n dropdown.init();\r\n element._kupolaDropdown = dropdown;\r\n}\r\n\r\nfunction initDropdowns(root = document) {\r\n root.querySelectorAll('.ds-dropdown').forEach(dropdown => {\r\n initDropdown(dropdown);\r\n });\r\n}\r\n\r\nfunction cleanupDropdown(dropdown) {\r\n if (dropdown._kupolaDropdown) {\r\n dropdown._kupolaDropdown.destroy();\r\n dropdown._kupolaDropdown = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllDropdowns() {\r\n document.querySelectorAll('.ds-dropdown').forEach(dropdown => {\r\n cleanupDropdown(dropdown);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('dropdown', initDropdown, cleanupDropdown);\r\n}","class Select {\r\n constructor(element) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-select__trigger');\r\n this.valueEl = element.querySelector('.ds-select__value') || element.querySelector('.ds-select__trigger span');\r\n this.optionsEl = element.querySelector('.ds-select__options') || element.querySelector('.ds-select__menu');\r\n this.nativeSelect = element.querySelector('select');\r\n this.icon = element.querySelector('.ds-select__icon');\r\n this.scope = `select-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._optionClickHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.optionsEl) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._optionClickHandler = (e) => {\r\n const option = e.currentTarget;\r\n const value = option.getAttribute('data-value');\r\n if (this.nativeSelect) {\r\n this.nativeSelect.value = value;\r\n }\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(o => o.classList.remove('is-selected'));\r\n option.classList.add('is-selected');\r\n this.updateValue(option.textContent.trim());\r\n this.hideOptions();\r\n if (this.nativeSelect) {\r\n this.nativeSelect.dispatchEvent(new Event('change'));\r\n }\r\n };\r\n\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(option => {\r\n option.addEventListener('click', this._optionClickHandler);\r\n option._selectOptionClickHandler = this._optionClickHandler;\r\n });\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.showOptions();\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hideOptions();\r\n }\r\n };\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.optionsEl.style.display = 'none';\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n updateValue(text) {\r\n if (this.valueEl) {\r\n this.valueEl.textContent = text || this.valueEl.textContent;\r\n }\r\n }\r\n\r\n showOptions() {\r\n const isOpen = this.optionsEl.style.display === 'block';\r\n this.optionsEl.style.display = isOpen ? 'none' : 'block';\r\n if (this.icon) {\r\n this.icon.style.transform = isOpen ? 'rotate(0deg)' : 'rotate(180deg)';\r\n }\r\n this.element.classList.toggle('is-open', !isOpen);\r\n }\r\n\r\n hideOptions() {\r\n this.optionsEl.style.display = 'none';\r\n if (this.icon) {\r\n this.icon.style.transform = 'rotate(0deg)';\r\n }\r\n this.element.classList.remove('is-open');\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.optionsEl) {\r\n this.optionsEl.querySelectorAll('.ds-select__option, .ds-select__item').forEach(option => {\r\n if (option._selectOptionClickHandler) {\r\n option.removeEventListener('click', option._selectOptionClickHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._optionClickHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initSelect(element) {\r\n const select = new Select(element);\r\n select.init();\r\n element._kupolaSelect = select;\r\n}\r\n\r\nfunction initSelects(root = document) {\r\n root.querySelectorAll('.ds-select').forEach(select => {\r\n initSelect(select);\r\n });\r\n}\r\n\r\nfunction cleanupSelect(select) {\r\n if (select._kupolaSelect) {\r\n select._kupolaSelect.destroy();\r\n select._kupolaSelect = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllSelects() {\r\n document.querySelectorAll('.ds-select').forEach(select => {\r\n cleanupSelect(select);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('select', initSelect, cleanupSelect);\r\n}","class Datepicker {\r\n constructor(element) {\r\n this.element = element;\r\n this.input = element.querySelector('input');\r\n this.icon = element.querySelector('.ds-datepicker__icon');\r\n this.calendarEl = element.querySelector('.ds-datepicker__calendar');\r\n this.scope = `datepicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._iconClickHandler = null;\r\n this._inputClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n }\r\n\r\n init() {\r\n if (!this.calendarEl) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._iconClickHandler = (e) => this.toggleCalendar(e);\r\n this._inputClickHandler = (e) => this.toggleCalendar(e);\r\n\r\n if (this.icon) {\r\n this.icon.addEventListener('click', this._iconClickHandler);\r\n }\r\n\r\n this.input.addEventListener('click', this._inputClickHandler);\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', (e) => this.hideCalendar(e), { scope: this.scope });\r\n this._resizeListener = window.globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', (e) => this.hideCalendar(e));\r\n window.addEventListener('resize', () => this.resizeHandler());\r\n this._documentClickHandler = (e) => this.hideCalendar(e);\r\n this._resizeHandler = () => this.resizeHandler();\r\n }\r\n\r\n this.element.__kupolaInitialized = true;\r\n this.initCalendar();\r\n }\r\n\r\n calculatePosition() {\r\n const pickerRect = this.element.getBoundingClientRect();\r\n const calendarRect = this.calendarEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n \r\n const spaceBelow = viewportHeight - pickerRect.bottom;\r\n const spaceAbove = pickerRect.top;\r\n const calendarHeight = calendarRect.height || 280;\r\n \r\n if (spaceBelow >= calendarHeight) {\r\n this.calendarEl.style.top = 'calc(100% + 4px)';\r\n this.calendarEl.style.bottom = 'auto';\r\n } else if (spaceAbove >= calendarHeight) {\r\n this.calendarEl.style.top = 'auto';\r\n this.calendarEl.style.bottom = 'calc(100% + 4px)';\r\n } else {\r\n this.calendarEl.style.top = 'calc(100% + 4px)';\r\n this.calendarEl.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n toggleCalendar(e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n const isVisible = this.calendarEl.style.display === 'block';\r\n \r\n document.querySelectorAll('.ds-datepicker__calendar').forEach(c => {\r\n c.style.display = 'none';\r\n c.setAttribute('hidden', '');\r\n });\r\n \r\n if (!isVisible) {\r\n this.calendarEl.style.display = 'block';\r\n this.calendarEl.removeAttribute('hidden');\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n hideCalendar(e) {\r\n if (!this.element.contains(e.target)) {\r\n this.calendarEl.style.display = 'none';\r\n this.calendarEl.setAttribute('hidden', '');\r\n }\r\n }\r\n\r\n resizeHandler() {\r\n if (this.calendarEl.style.display === 'block') {\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n initCalendar() {\r\n const calendar = this.calendarEl;\r\n const input = this.input;\r\n const titleEl = calendar.querySelector('.ds-datepicker__title');\r\n const daysEl = calendar.querySelector('.ds-datepicker__days');\r\n const prevBtn = calendar.querySelector('.ds-datepicker__nav--prev');\r\n const nextBtn = calendar.querySelector('.ds-datepicker__nav--next');\r\n \r\n let currentDate = new Date();\r\n if (input.value) {\r\n const parts = input.value.split('-');\r\n if (parts.length === 3) {\r\n currentDate = new Date(parts[0], parts[1] - 1, parts[2]);\r\n }\r\n }\r\n \r\n function renderCalendar() {\r\n daysEl.querySelectorAll('.ds-datepicker__day').forEach(dayEl => {\r\n if (dayEl._dayClickHandler) {\r\n dayEl.removeEventListener('click', dayEl._dayClickHandler);\r\n }\r\n });\r\n \r\n daysEl.innerHTML = '';\r\n \r\n const year = currentDate.getFullYear();\r\n const month = currentDate.getMonth();\r\n \r\n titleEl.textContent = `${year} ${['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][month]}`;\r\n \r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n \r\n for (let i = 0; i < firstDay; i++) {\r\n const emptyDay = document.createElement('span');\r\n emptyDay.className = 'ds-datepicker__day--empty';\r\n daysEl.appendChild(emptyDay);\r\n }\r\n \r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-datepicker__day';\r\n dayEl.textContent = day;\r\n \r\n const dateStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n if (input.value === dateStr) {\r\n dayEl.classList.add('is-selected');\r\n }\r\n \r\n const today = new Date();\r\n const todayStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;\r\n if (dateStr === todayStr) {\r\n dayEl.classList.add('is-today');\r\n }\r\n \r\n const dayClickHandler = () => {\r\n input.value = dateStr;\r\n calendar.style.display = 'none';\r\n calendar.setAttribute('hidden', '');\r\n input.dispatchEvent(new Event('change'));\r\n };\r\n \r\n dayEl.addEventListener('click', dayClickHandler);\r\n dayEl._dayClickHandler = dayClickHandler;\r\n \r\n daysEl.appendChild(dayEl);\r\n }\r\n }\r\n \r\n const prevClickHandler = (e) => {\r\n e.stopPropagation();\r\n currentDate.setMonth(currentDate.getMonth() - 1);\r\n renderCalendar();\r\n };\r\n \r\n const nextClickHandler = (e) => {\r\n e.stopPropagation();\r\n currentDate.setMonth(currentDate.getMonth() + 1);\r\n renderCalendar();\r\n };\r\n \r\n if (prevBtn) {\r\n prevBtn.addEventListener('click', prevClickHandler);\r\n prevBtn._prevClickHandler = prevClickHandler;\r\n }\r\n \r\n if (nextBtn) {\r\n nextBtn.addEventListener('click', nextClickHandler);\r\n nextBtn._nextClickHandler = nextClickHandler;\r\n }\r\n \r\n calendar._calendarInitialized = true;\r\n renderCalendar();\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.icon && this._iconClickHandler) {\r\n this.icon.removeEventListener('click', this._iconClickHandler);\r\n }\r\n\r\n if (this.input && this._inputClickHandler) {\r\n this.input.removeEventListener('click', this._inputClickHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n if (this._resizeListener && this._resizeListener.unsubscribe) {\r\n this._resizeListener.unsubscribe();\r\n } else if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler);\r\n }\r\n\r\n if (this.calendarEl) {\r\n const daysEl = this.calendarEl.querySelector('.ds-datepicker__days');\r\n if (daysEl) {\r\n daysEl.querySelectorAll('.ds-datepicker__day').forEach(dayEl => {\r\n if (dayEl._dayClickHandler) {\r\n dayEl.removeEventListener('click', dayEl._dayClickHandler);\r\n }\r\n });\r\n }\r\n const prevBtn = this.calendarEl.querySelector('.ds-datepicker__nav--prev');\r\n const nextBtn = this.calendarEl.querySelector('.ds-datepicker__nav--next');\r\n if (prevBtn && prevBtn._prevClickHandler) {\r\n prevBtn.removeEventListener('click', prevBtn._prevClickHandler);\r\n }\r\n if (nextBtn && nextBtn._nextClickHandler) {\r\n nextBtn.removeEventListener('click', nextBtn._nextClickHandler);\r\n }\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._resizeHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeListener = null;\r\n this._iconClickHandler = null;\r\n this._inputClickHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initDatepicker(element) {\r\n const picker = new Datepicker(element);\r\n picker.init();\r\n element._kupolaDatepicker = picker;\r\n}\r\n\r\nfunction initDatepickers(root = document) {\r\n root.querySelectorAll('.ds-datepicker').forEach(picker => {\r\n initDatepicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupDatepicker(picker) {\r\n if (picker._kupolaDatepicker) {\r\n picker._kupolaDatepicker.destroy();\r\n picker._kupolaDatepicker = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllDatepickers() {\r\n document.querySelectorAll('.ds-datepicker').forEach(picker => {\r\n cleanupDatepicker(picker);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('datepicker', initDatepicker, cleanupDatepicker);\r\n}","class Timepicker {\r\n constructor(element) {\r\n this.element = element;\r\n this.input = element.querySelector('input');\r\n this.inputWrap = element.querySelector('.ds-timepicker__input-wrap');\r\n this.panelEl = null;\r\n this.scope = `timepicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._inputWrapClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n \r\n this.selectedHour = 12;\r\n this.selectedMinute = 0;\r\n }\r\n\r\n init() {\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._inputWrapClickHandler = (e) => {\r\n e.stopPropagation();\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n this.panelEl.style.display = 'none';\r\n } else {\r\n this.showTimepicker();\r\n }\r\n };\r\n\r\n this.inputWrap.addEventListener('click', this._inputWrapClickHandler);\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', (e) => this.hideTimepicker(e), { scope: this.scope });\r\n this._resizeListener = window.globalEvents.on(window, 'resize', () => this.resizeHandler(), { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', (e) => this.hideTimepicker(e));\r\n window.addEventListener('resize', () => this.resizeHandler());\r\n this._documentClickHandler = (e) => this.hideTimepicker(e);\r\n this._resizeHandler = () => this.resizeHandler();\r\n }\r\n\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n calculatePosition() {\r\n if (!this.panelEl) return;\r\n \r\n const pickerRect = this.element.getBoundingClientRect();\r\n const panelRect = this.panelEl.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n \r\n const spaceBelow = viewportHeight - pickerRect.bottom;\r\n const spaceAbove = pickerRect.top;\r\n const panelHeight = panelRect.height || 320;\r\n \r\n if (spaceBelow >= panelHeight) {\r\n this.panelEl.style.top = 'calc(100% + 4px)';\r\n this.panelEl.style.bottom = 'auto';\r\n } else if (spaceAbove >= panelHeight) {\r\n this.panelEl.style.top = 'auto';\r\n this.panelEl.style.bottom = 'calc(100% + 4px)';\r\n } else {\r\n this.panelEl.style.top = 'calc(100% + 4px)';\r\n this.panelEl.style.bottom = 'auto';\r\n }\r\n }\r\n\r\n showTimepicker() {\r\n if (this.panelEl) {\r\n this.panelEl.style.display = 'block';\r\n this.calculatePosition();\r\n return;\r\n }\r\n \r\n this.panelEl = document.createElement('div');\r\n this.panelEl.className = 'ds-timepicker__panel';\r\n this.panelEl.innerHTML = `\r\n <div class=\"ds-timepicker__header\">\r\n <div class=\"ds-timepicker__display\">\r\n <span class=\"ds-timepicker__display-hour\">12</span>\r\n <span class=\"ds-timepicker__separator\">:</span>\r\n <span class=\"ds-timepicker__display-minute\">00</span>\r\n </div>\r\n </div>\r\n <div class=\"ds-timepicker__body\">\r\n <div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Hour</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--hour\" data-type=\"hour\"></div>\r\n </div>\r\n <div class=\"ds-timepicker__section\">\r\n <div class=\"ds-timepicker__section-label\">Minute</div>\r\n <div class=\"ds-timepicker__grid ds-timepicker__grid--minute\" data-type=\"minute\"></div>\r\n </div>\r\n </div>\r\n `;\r\n this.element.appendChild(this.panelEl);\r\n \r\n if (this.input.value) {\r\n const timeParts = this.input.value.split(':');\r\n if (timeParts.length >= 2) {\r\n this.selectedHour = parseInt(timeParts[0]) || 0;\r\n this.selectedMinute = parseInt(timeParts[1]) || 0;\r\n }\r\n }\r\n \r\n const displayHour = this.panelEl.querySelector('.ds-timepicker__display-hour');\r\n const displayMinute = this.panelEl.querySelector('.ds-timepicker__display-minute');\r\n \r\n function updateDisplay() {\r\n displayHour.textContent = String(this.selectedHour).padStart(2, '0');\r\n displayMinute.textContent = String(this.selectedMinute).padStart(2, '0');\r\n }\r\n \r\n function updateInput() {\r\n this.input.value = `${String(this.selectedHour).padStart(2, '0')}:${String(this.selectedMinute).padStart(2, '0')}`;\r\n }\r\n \r\n function selectTimeAndClose() {\r\n updateInput.call(this);\r\n this.panelEl.style.display = 'none';\r\n this.input.dispatchEvent(new Event('change'));\r\n }\r\n \r\n const hourGrid = this.panelEl.querySelector('[data-type=\"hour\"]');\r\n const minuteGrid = this.panelEl.querySelector('[data-type=\"minute\"]');\r\n \r\n for (let i = 0; i < 24; i++) {\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n if (i === this.selectedHour) btn.classList.add('is-selected');\r\n btn.addEventListener('click', () => {\r\n hourGrid.querySelectorAll('.ds-timepicker__item').forEach(b => b.classList.remove('is-selected'));\r\n btn.classList.add('is-selected');\r\n this.selectedHour = i;\r\n updateDisplay.call(this);\r\n selectTimeAndClose.call(this);\r\n });\r\n hourGrid.appendChild(btn);\r\n }\r\n \r\n for (let i = 0; i < 60; i += 5) {\r\n const btn = document.createElement('button');\r\n btn.className = 'ds-timepicker__item';\r\n btn.textContent = String(i).padStart(2, '0');\r\n if (i === this.selectedMinute) btn.classList.add('is-selected');\r\n btn.addEventListener('click', () => {\r\n minuteGrid.querySelectorAll('.ds-timepicker__item').forEach(b => b.classList.remove('is-selected'));\r\n btn.classList.add('is-selected');\r\n this.selectedMinute = i;\r\n updateDisplay.call(this);\r\n selectTimeAndClose.call(this);\r\n });\r\n minuteGrid.appendChild(btn);\r\n }\r\n \r\n this.panelEl.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n });\r\n \r\n updateDisplay.call(this);\r\n updateInput.call(this);\r\n \r\n setTimeout(() => {\r\n this.calculatePosition();\r\n }, 0);\r\n }\r\n\r\n hideTimepicker(e) {\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n if (!this.element.contains(e.target)) {\r\n this.panelEl.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n resizeHandler() {\r\n if (this.panelEl && this.panelEl.style.display === 'block') {\r\n this.calculatePosition();\r\n }\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.inputWrap && this._inputWrapClickHandler) {\r\n this.inputWrap.removeEventListener('click', this._inputWrapClickHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n if (this._resizeListener && this._resizeListener.unsubscribe) {\r\n this._resizeListener.unsubscribe();\r\n } else if (this._resizeHandler) {\r\n window.removeEventListener('resize', this._resizeHandler);\r\n }\r\n\r\n if (this.panelEl) {\r\n this.panelEl.remove();\r\n this.panelEl = null;\r\n }\r\n\r\n this._inputWrapClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._resizeHandler = null;\r\n this._resizeListener = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initTimepicker(element) {\r\n const picker = new Timepicker(element);\r\n picker.init();\r\n element._kupolaTimepicker = picker;\r\n}\r\n\r\nfunction initTimepickers(root = document) {\r\n root.querySelectorAll('.ds-timepicker').forEach(picker => {\r\n initTimepicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupTimepicker(element) {\r\n if (element._kupolaTimepicker) {\r\n element._kupolaTimepicker.destroy();\r\n element._kupolaTimepicker = null;\r\n }\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('timepicker', initTimepicker, cleanupTimepicker);\r\n}","class Slider {\r\n constructor(element) {\r\n this.element = element;\r\n this.track = element.querySelector('.ds-slider__track');\r\n this.fill = element.querySelector('.ds-slider__fill');\r\n this.input = element.querySelector('.ds-slider__input');\r\n this.valueEl = element.querySelector('.ds-slider__value');\r\n\r\n if (!this.track || !this.fill || !this.input) {\r\n throw new Error('Slider: Missing required elements');\r\n }\r\n\r\n this._bindEvents();\r\n this.updateSlider();\r\n }\r\n\r\n _bindEvents() {\r\n this.updateSlider = () => {\r\n const value = this.input.value;\r\n const min = this.input.min || 0;\r\n const max = this.input.max || 100;\r\n const percentage = ((value - min) / (max - min)) * 100;\r\n\r\n this.fill.style.width = `${percentage}%`;\r\n if (this.valueEl) {\r\n this.valueEl.textContent = value;\r\n }\r\n this.element.setAttribute('aria-valuenow', value);\r\n };\r\n\r\n this.input.addEventListener('input', this.updateSlider);\r\n this.input.addEventListener('change', this.updateSlider);\r\n\r\n this._listeners = [\r\n { el: this.input, event: 'input', handler: this.updateSlider },\r\n { el: this.input, event: 'change', handler: this.updateSlider }\r\n ];\r\n }\r\n\r\n destroy() {\r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.track = null;\r\n this.fill = null;\r\n this.input = null;\r\n this.valueEl = null;\r\n this.element = null;\r\n }\r\n\r\n setValue(value) {\r\n if (this.input) {\r\n this.input.value = value;\r\n this.updateSlider();\r\n }\r\n }\r\n\r\n getValue() {\r\n return this.input?.value;\r\n }\r\n}\r\n\r\nfunction initSlider(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const slider = new Slider(element);\r\n element.__kupolaInstance = slider;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[Slider] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupSlider(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const slider = element.__kupolaInstance;\r\n slider.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initSliders() {\r\n document.querySelectorAll('.ds-slider').forEach(slider => {\r\n initSlider(slider);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('slider', initSlider, cleanupSlider);\r\n}","class Carousel {\r\n constructor(element) {\r\n this.element = element;\r\n this.track = element.querySelector('.ds-carousel__track');\r\n this.items = element.querySelectorAll('.ds-carousel__item');\r\n this.prevBtn = element.querySelector('.ds-carousel__prev');\r\n this.nextBtn = element.querySelector('.ds-carousel__next');\r\n this.indicators = element.querySelectorAll('.ds-carousel__indicator');\r\n this.autoBtn = element.querySelector('.ds-carousel__auto');\r\n \r\n this.currentIndex = 0;\r\n this.totalItems = this.items.length;\r\n this.autoPlayTimer = null;\r\n this.isAutoPlaying = false;\r\n \r\n this._mouseEnterHandler = () => this.stopAutoPlay();\r\n this._mouseLeaveHandler = () => { if (this.isAutoPlaying) this.startAutoPlay(); };\r\n \r\n this.init();\r\n }\r\n \r\n init() {\r\n this._prevClickHandler = () => this.prev();\r\n this._nextClickHandler = () => this.next();\r\n this._autoClickHandler = () => this.toggleAutoPlay();\r\n this._indicatorClickHandlers = [];\r\n \r\n if (this.prevBtn) {\r\n this.prevBtn.addEventListener('click', this._prevClickHandler);\r\n }\r\n if (this.nextBtn) {\r\n this.nextBtn.addEventListener('click', this._nextClickHandler);\r\n }\r\n \r\n this.indicators.forEach((indicator, index) => {\r\n const handler = () => this.goTo(index);\r\n this._indicatorClickHandlers.push(handler);\r\n indicator.addEventListener('click', handler);\r\n });\r\n \r\n if (this.autoBtn) {\r\n this.autoBtn.addEventListener('click', this._autoClickHandler);\r\n }\r\n \r\n this.updateIndicators();\r\n this.startAutoPlay();\r\n \r\n this.element.addEventListener('mouseenter', this._mouseEnterHandler);\r\n this.element.addEventListener('mouseleave', this._mouseLeaveHandler);\r\n }\r\n \r\n goTo(index) {\r\n if (index < 0 || index >= this.totalItems) return;\r\n \r\n this.currentIndex = index;\r\n const offset = -index * 100;\r\n this.track.style.transform = `translateX(${offset}%)`;\r\n this.updateIndicators();\r\n }\r\n \r\n prev() {\r\n const newIndex = this.currentIndex > 0 ? this.currentIndex - 1 : this.totalItems - 1;\r\n this.goTo(newIndex);\r\n }\r\n \r\n next() {\r\n const newIndex = this.currentIndex < this.totalItems - 1 ? this.currentIndex + 1 : 0;\r\n this.goTo(newIndex);\r\n }\r\n \r\n updateIndicators() {\r\n this.indicators.forEach((indicator, index) => {\r\n if (index === this.currentIndex) {\r\n indicator.classList.add('is-active');\r\n } else {\r\n indicator.classList.remove('is-active');\r\n }\r\n });\r\n }\r\n \r\n startAutoPlay() {\r\n if (this.totalItems <= 1) return;\r\n this.stopAutoPlay();\r\n this.isAutoPlaying = true;\r\n if (this.autoBtn) {\r\n this.autoBtn.classList.add('is-active');\r\n }\r\n this.autoPlayTimer = setInterval(() => this.next(), 3000);\r\n }\r\n \r\n stopAutoPlay() {\r\n if (this.autoPlayTimer) {\r\n clearInterval(this.autoPlayTimer);\r\n this.autoPlayTimer = null;\r\n }\r\n if (this.autoBtn) {\r\n this.autoBtn.classList.remove('is-active');\r\n }\r\n }\r\n \r\n toggleAutoPlay() {\r\n if (this.isAutoPlaying) {\r\n this.isAutoPlaying = false;\r\n this.stopAutoPlay();\r\n } else {\r\n this.startAutoPlay();\r\n }\r\n }\r\n \r\n destroy() {\r\n this.stopAutoPlay();\r\n this.element.removeEventListener('mouseenter', this._mouseEnterHandler);\r\n this.element.removeEventListener('mouseleave', this._mouseLeaveHandler);\r\n \r\n if (this.prevBtn && this._prevClickHandler) {\r\n this.prevBtn.removeEventListener('click', this._prevClickHandler);\r\n }\r\n if (this.nextBtn && this._nextClickHandler) {\r\n this.nextBtn.removeEventListener('click', this._nextClickHandler);\r\n }\r\n if (this.autoBtn && this._autoClickHandler) {\r\n this.autoBtn.removeEventListener('click', this._autoClickHandler);\r\n }\r\n \r\n this.indicators.forEach((indicator, index) => {\r\n const handler = this._indicatorClickHandlers[index];\r\n if (handler) {\r\n indicator.removeEventListener('click', handler);\r\n }\r\n });\r\n \r\n this._prevClickHandler = null;\r\n this._nextClickHandler = null;\r\n this._autoClickHandler = null;\r\n this._indicatorClickHandlers = null;\r\n }\r\n}\r\n\r\nfunction initCarousel(element) {\r\n if (element.__kupolaInitialized) return;\r\n \r\n const carousel = new Carousel(element);\r\n element.__kupolaInstance = carousel;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction initCarousels(root = document) {\r\n root.querySelectorAll('.ds-carousel').forEach(carousel => {\r\n initCarousel(carousel);\r\n });\r\n}\r\n\r\nfunction cleanupCarousel(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n \r\n const carousel = element.__kupolaInstance;\r\n carousel.destroy();\r\n \r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Carousel, initCarousel, initCarousels, cleanupCarousel };\r\n} else {\r\n window.Carousel = Carousel;\r\n window.initCarousel = initCarousel;\r\n window.initCarousels = initCarousels;\r\n \r\n if (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('carousel', initCarousel, cleanupCarousel);\r\n }\r\n}\r\n","class Drawer {\r\n constructor(element) {\r\n this.element = element;\r\n this.mask = element.querySelector('.ds-drawer-mask');\r\n this.drawerEl = element.querySelector('.ds-drawer');\r\n this._bindEvents();\r\n }\r\n\r\n _bindEvents() {\r\n const closeBtn = this.mask?.querySelector('.ds-drawer__close');\r\n const cancelBtn = this.mask?.querySelector('.ds-drawer__footer .ds-btn--ghost');\r\n const confirmBtn = this.mask?.querySelector('.ds-drawer__footer .ds-btn--brand');\r\n\r\n this.closeDrawer = () => {\r\n if (this.mask) {\r\n this.mask.classList.remove('is-visible');\r\n }\r\n if (this.drawerEl) {\r\n this.drawerEl.classList.remove('is-visible');\r\n }\r\n };\r\n\r\n this.handleMaskClick = (e) => {\r\n if (e.target === this.mask) {\r\n this.closeDrawer();\r\n }\r\n };\r\n\r\n if (this.mask) {\r\n this.mask.addEventListener('click', this.handleMaskClick);\r\n }\r\n\r\n if (closeBtn) {\r\n closeBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', this.closeDrawer);\r\n }\r\n\r\n this._listeners = [\r\n { el: this.mask, event: 'click', handler: this.handleMaskClick },\r\n { el: closeBtn, event: 'click', handler: this.closeDrawer },\r\n { el: cancelBtn, event: 'click', handler: this.closeDrawer },\r\n { el: confirmBtn, event: 'click', handler: this.closeDrawer }\r\n ].filter(item => item.el);\r\n }\r\n\r\n destroy() {\r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.mask = null;\r\n this.drawerEl = null;\r\n this.element = null;\r\n }\r\n\r\n open() {\r\n if (this.mask) {\r\n this.mask.classList.add('is-visible');\r\n }\r\n if (this.drawerEl) {\r\n this.drawerEl.classList.add('is-visible');\r\n }\r\n }\r\n\r\n close() {\r\n this.closeDrawer();\r\n }\r\n}\r\n\r\nfunction initDrawer(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const drawer = new Drawer(element);\r\n element.__kupolaInstance = drawer;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupDrawer(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const drawer = element.__kupolaInstance;\r\n drawer.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initDrawers() {\r\n document.querySelectorAll('[data-drawer]').forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n const drawerId = trigger.getAttribute('data-drawer');\r\n const drawer = document.getElementById(drawerId);\r\n\r\n if (!drawer) return;\r\n\r\n initDrawer(drawer);\r\n drawer.__kupolaInstance?.open();\r\n });\r\n });\r\n\r\n document.querySelectorAll('.ds-drawer-mask').forEach(mask => {\r\n const drawerEl = mask.parentElement;\r\n if (drawerEl) {\r\n initDrawer(drawerEl);\r\n }\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('drawer', initDrawer, cleanupDrawer);\r\n}","class Modal {\r\n constructor(element) {\r\n this.element = element;\r\n this.mask = element.querySelector('.ds-modal-mask');\r\n this.modal = element.querySelector('.ds-modal');\r\n this.closeBtn = element.querySelector('.ds-modal__close');\r\n \r\n this._keydownHandler = (e) => {\r\n if (e.key === 'Escape' && this.isVisible()) {\r\n this.close();\r\n }\r\n };\r\n \r\n this._closeBtnClickHandler = () => this.close();\r\n \r\n this._maskClickHandler = (e) => {\r\n if (e.target === this.mask) {\r\n this.close();\r\n }\r\n };\r\n \r\n this.init();\r\n }\r\n \r\n init() {\r\n if (this.closeBtn) {\r\n this.closeBtn.addEventListener('click', this._closeBtnClickHandler);\r\n }\r\n \r\n if (this.mask) {\r\n this.mask.addEventListener('click', this._maskClickHandler);\r\n }\r\n \r\n document.addEventListener('keydown', this._keydownHandler);\r\n }\r\n \r\n open() {\r\n this.mask.classList.add('is-visible');\r\n Modal._openCount = (Modal._openCount || 0) + 1;\r\n document.body.style.overflow = 'hidden';\r\n }\r\n \r\n close() {\r\n this.mask.classList.remove('is-visible');\r\n Modal._openCount = Math.max(0, (Modal._openCount || 0) - 1);\r\n if (Modal._openCount === 0) {\r\n document.body.style.overflow = '';\r\n }\r\n }\r\n \r\n isVisible() {\r\n return this.mask.classList.contains('is-visible');\r\n }\r\n \r\n destroy() {\r\n document.removeEventListener('keydown', this._keydownHandler);\r\n if (this.closeBtn) {\r\n this.closeBtn.removeEventListener('click', this._closeBtnClickHandler);\r\n }\r\n if (this.mask) {\r\n this.mask.removeEventListener('click', this._maskClickHandler);\r\n }\r\n if (this.isVisible()) {\r\n this.close();\r\n }\r\n }\r\n}\r\n\r\nModal._openCount = 0;\r\n\r\nfunction createModal(options = {}) {\r\n const {\r\n title = '',\r\n content = '',\r\n width = '480px',\r\n onConfirm,\r\n onCancel\r\n } = options;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal\" style=\"max-width: ${width}\">\r\n <div class=\"ds-modal__header\">\r\n <span class=\"ds-modal__title\"></span>\r\n <button class=\"ds-modal__close\" aria-label=\"Close\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-modal__body\"></div>\r\n ${onConfirm || onCancel ? `\r\n <div class=\"ds-modal__footer\">\r\n ${onCancel ? `<button class=\"ds-btn ds-btn--ghost\" data-modal-cancel>Cancel</button>` : ''}\r\n ${onConfirm ? `<button class=\"ds-btn ds-btn--brand\" data-modal-confirm>OK</button>` : ''}\r\n </div>\r\n ` : ''}\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n const modal = new Modal(container);\r\n \r\n const titleEl = container.querySelector('.ds-modal__title');\r\n if (titleEl) titleEl.textContent = title;\r\n const bodyEl = container.querySelector('.ds-modal__body');\r\n if (bodyEl) bodyEl.textContent = content;\r\n \r\n const confirmBtn = container.querySelector('[data-modal-confirm]');\r\n const cancelBtn = container.querySelector('[data-modal-cancel]');\r\n \r\n const confirmHandler = () => {\r\n if (onConfirm) onConfirm();\r\n modal.close();\r\n };\r\n \r\n const cancelHandler = () => {\r\n if (onCancel) onCancel();\r\n modal.close();\r\n };\r\n \r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', confirmHandler);\r\n }\r\n \r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', cancelHandler);\r\n }\r\n \r\n const closeAndDestroy = () => {\r\n setTimeout(() => {\r\n if (confirmBtn) {\r\n confirmBtn.removeEventListener('click', confirmHandler);\r\n }\r\n if (cancelBtn) {\r\n cancelBtn.removeEventListener('click', cancelHandler);\r\n }\r\n modal.destroy();\r\n container.remove();\r\n }, 300);\r\n };\r\n \r\n const originalClose = modal.close.bind(modal);\r\n modal.close = () => {\r\n originalClose();\r\n closeAndDestroy();\r\n };\r\n \r\n modal.open();\r\n \r\n return modal;\r\n}\r\n\r\nfunction initModal(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const modal = new Modal(element);\r\n element.__kupolaInstance = modal;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupModal(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const modal = element.__kupolaInstance;\r\n modal.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initModals() {\r\n document.querySelectorAll('.ds-modal-container').forEach(container => {\r\n initModal(container);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Modal, initModals, initModal, cleanupModal, createModal };\r\n} else {\r\n window.initModal = initModal;\r\n window.cleanupModal = cleanupModal;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('modal', initModal, cleanupModal);\r\n}\r\n","class Dialog {\r\n static normal(options = {}) {\r\n return this._create({ type: 'normal', ...options });\r\n }\r\n \r\n static success(options = {}) {\r\n return this._create({ type: 'success', ...options });\r\n }\r\n \r\n static warning(options = {}) {\r\n return this._create({ type: 'warning', ...options });\r\n }\r\n \r\n static error(options = {}) {\r\n return this._create({ type: 'error', ...options });\r\n }\r\n \r\n static info(options = {}) {\r\n return this._create({ type: 'info', ...options });\r\n }\r\n \r\n static confirm(options = {}) {\r\n return this._create({ type: 'confirm', ...options });\r\n }\r\n \r\n static _create(options) {\r\n const {\r\n type = 'normal',\r\n title = '',\r\n content = '',\r\n onConfirm,\r\n onCancel\r\n } = options;\r\n \r\n const icons = {\r\n normal: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>`,\r\n success: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\r\n warning: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 9v4M12 17h.01\"/><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/></svg>`,\r\n error: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/></svg>`,\r\n info: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>`,\r\n confirm: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 9v4M12 17h.01\"/><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/></svg>`\r\n };\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-modal-container';\r\n container.innerHTML = `\r\n <div class=\"ds-modal-mask\">\r\n <div class=\"ds-modal\" style=\"max-width: 360px\">\r\n <div class=\"ds-modal__body\" style=\"text-align: center; padding: 24px 16px;\">\r\n <div class=\"ds-dialog__icon ds-dialog__icon--${type}\">${icons[type]}</div>\r\n ${title ? '<div class=\"ds-dialog__title\"></div>' : ''}\r\n <div class=\"ds-dialog__content\"></div>\r\n <div class=\"ds-dialog__actions\">\r\n ${type === 'confirm' || onCancel ? `<button class=\"ds-btn ds-btn--ghost\" data-dialog-cancel>Cancel</button>` : ''}\r\n <button class=\"ds-btn ${type === 'confirm' ? 'ds-btn--brand' : 'ds-btn--ghost'}\" data-dialog-confirm>\r\n ${type === 'confirm' ? 'Confirm' : 'OK'}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(container);\r\n \r\n if (title) container.querySelector('.ds-dialog__title').textContent = title;\r\n container.querySelector('.ds-dialog__content').textContent = content;\r\n \r\n const mask = container.querySelector('.ds-modal-mask');\r\n const confirmBtn = container.querySelector('[data-dialog-confirm]');\r\n const cancelBtn = container.querySelector('[data-dialog-cancel]');\r\n \r\n const keydownHandler = function(e) {\r\n if (e.key === 'Escape') {\r\n if (onCancel) onCancel();\r\n close();\r\n }\r\n };\r\n \r\n const maskClickHandler = function(e) {\r\n if (e.target === mask) {\r\n if (onCancel) onCancel();\r\n close();\r\n }\r\n };\r\n \r\n const confirmClickHandler = function() {\r\n if (onConfirm) onConfirm();\r\n close();\r\n };\r\n \r\n const cancelClickHandler = function() {\r\n if (onCancel) onCancel();\r\n close();\r\n };\r\n \r\n const close = () => {\r\n mask.classList.remove('is-visible');\r\n document.body.style.overflow = '';\r\n document.removeEventListener('keydown', keydownHandler);\r\n mask.removeEventListener('click', maskClickHandler);\r\n if (confirmBtn) {\r\n confirmBtn.removeEventListener('click', confirmClickHandler);\r\n }\r\n if (cancelBtn) {\r\n cancelBtn.removeEventListener('click', cancelClickHandler);\r\n }\r\n setTimeout(() => container.remove(), 300);\r\n };\r\n \r\n mask.classList.add('is-visible');\r\n document.body.style.overflow = 'hidden';\r\n \r\n if (confirmBtn) {\r\n confirmBtn.addEventListener('click', confirmClickHandler);\r\n }\r\n \r\n if (cancelBtn) {\r\n cancelBtn.addEventListener('click', cancelClickHandler);\r\n }\r\n \r\n mask.addEventListener('click', maskClickHandler);\r\n document.addEventListener('keydown', keydownHandler);\r\n \r\n return { close };\r\n }\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = Dialog;\r\n}","class FileUpload {\r\n constructor(element) {\r\n this.element = element;\r\n this.dropzone = element.querySelector('.ds-fileupload__dropzone');\r\n this.input = element.querySelector('.ds-fileupload__input');\r\n this.list = element.querySelector('.ds-fileupload__list');\r\n this.progress = element.querySelector('.ds-fileupload__preview');\r\n \r\n this.files = [];\r\n this.maxSize = parseInt(element.getAttribute('data-max-size')) || 0;\r\n this.maxCount = parseInt(element.getAttribute('data-max-count')) || 0;\r\n this._listeners = [];\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const clickHandler = (e) => {\r\n if (e.target === this.input || this.input.contains(e.target)) return;\r\n this.input.click();\r\n };\r\n\r\n const changeHandler = (e) => {\r\n const files = Array.from(e.target.files);\r\n this.addFiles(files);\r\n e.target.value = '';\r\n };\r\n\r\n const dragoverHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.add('is-dragging');\r\n };\r\n\r\n const dragleaveHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.remove('is-dragging');\r\n };\r\n\r\n const dropHandler = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.dropzone.classList.remove('is-dragging');\r\n \r\n const files = Array.from(e.dataTransfer.files);\r\n this.addFiles(files);\r\n };\r\n\r\n this.dropzone.addEventListener('click', clickHandler);\r\n this.input.addEventListener('change', changeHandler);\r\n this.dropzone.addEventListener('dragover', dragoverHandler);\r\n this.dropzone.addEventListener('dragleave', dragleaveHandler);\r\n this.dropzone.addEventListener('drop', dropHandler);\r\n\r\n this._listeners.push(\r\n { el: this.dropzone, event: 'click', handler: clickHandler },\r\n { el: this.input, event: 'change', handler: changeHandler },\r\n { el: this.dropzone, event: 'dragover', handler: dragoverHandler },\r\n { el: this.dropzone, event: 'dragleave', handler: dragleaveHandler },\r\n { el: this.dropzone, event: 'drop', handler: dropHandler }\r\n );\r\n }\r\n\r\n addFiles(files) {\r\n files.forEach(file => {\r\n if (this.maxCount > 0 && this.files.length >= this.maxCount) {\r\n this.showError(`Maximum ${this.maxCount} files allowed`);\r\n return;\r\n }\r\n if (this.isValidFile(file)) {\r\n this.files.push(file);\r\n this.renderFileItem(file);\r\n this.showPreview(file);\r\n }\r\n });\r\n \r\n this.dispatchChange();\r\n }\r\n\r\n isValidFile(file) {\r\n const accept = this.input.getAttribute('accept');\r\n if (accept && accept !== '') {\r\n const types = accept.split(',').map(t => t.trim());\r\n const fileType = file.type;\r\n const fileName = file.name.toLowerCase();\r\n \r\n const isValidType = types.some(type => {\r\n if (type.startsWith('.')) {\r\n return fileName.endsWith(type);\r\n } else if (type.includes('/')) {\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.replace('/*', ''));\r\n }\r\n return fileType === type;\r\n }\r\n return true;\r\n });\r\n \r\n if (!isValidType) {\r\n this.showError(`File type not allowed: ${file.type}`);\r\n return false;\r\n }\r\n }\r\n \r\n if (this.maxSize > 0 && file.size > this.maxSize) {\r\n this.showError(`File size exceeds ${this.formatSize(this.maxSize)}`);\r\n return false;\r\n }\r\n \r\n return true;\r\n }\r\n\r\n renderFileItem(file) {\r\n const item = document.createElement('div');\r\n item.className = 'ds-fileupload__item';\r\n item.dataset.filename = file.name;\r\n \r\n const fileIcon = this.getFileIcon(file.type);\r\n \r\n item.innerHTML = `\r\n <div class=\"ds-fileupload__icon\" style=\"width: 24px; height: 24px; border-radius: 4px;\">\r\n ${fileIcon}\r\n </div>\r\n <span class=\"ds-fileupload__filename\">${this.truncateFilename(file.name)}</span>\r\n <span class=\"ds-fileupload__size\">${this.formatSize(file.size)}</span>\r\n <button class=\"ds-fileupload__remove\" type=\"button\" aria-label=\"Remove file\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n `;\r\n \r\n const removeBtn = item.querySelector('.ds-fileupload__remove');\r\n const removeHandler = () => {\r\n this.removeFile(file, item);\r\n };\r\n removeBtn.addEventListener('click', removeHandler);\r\n \r\n this._listeners.push({ el: removeBtn, event: 'click', handler: removeHandler });\r\n \r\n if (!this.list) {\r\n this.list = document.createElement('div');\r\n this.list.className = 'ds-fileupload__list';\r\n this.element.appendChild(this.list);\r\n }\r\n \r\n this.list.appendChild(item);\r\n }\r\n\r\n getFileIcon(type) {\r\n if (type.startsWith('image/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></svg>';\r\n }\r\n if (type.startsWith('video/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"23 7 16 12 23 17 23 7\"/><rect x=\"1\" y=\"5\" width=\"15\" height=\"14\" rx=\"2\" ry=\"2\"/></svg>';\r\n }\r\n if (type.startsWith('audio/')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"/><path d=\"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07\"/></svg>';\r\n }\r\n if (type.includes('pdf')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/><polyline points=\"10 9 9 9 8 9\"/></svg>';\r\n }\r\n if (type.includes('document') || type.includes('text')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/><polyline points=\"10 9 9 9 8 9\"/></svg>';\r\n }\r\n if (type.includes('zip') || type.includes('archive')) {\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M16 11V7a4 4 0 0 0-8 0v4\"/><polyline points=\"10 14 8 16 6 14\"/></svg>';\r\n }\r\n return '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>';\r\n }\r\n\r\n truncateFilename(name, maxLength = 20) {\r\n if (name.length <= maxLength) return name;\r\n const extension = name.substring(name.lastIndexOf('.'));\r\n const nameWithoutExt = name.substring(0, name.lastIndexOf('.'));\r\n const truncated = nameWithoutExt.substring(0, maxLength - extension.length - 3) + '...';\r\n return truncated + extension;\r\n }\r\n\r\n formatSize(bytes) {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\r\n }\r\n\r\n removeFile(file, itemElement) {\r\n this.files = this.files.filter(f => f !== file);\r\n if (itemElement) {\r\n itemElement.remove();\r\n }\r\n if (this.files.length === 0 && this.list) {\r\n this.list.remove();\r\n this.list = null;\r\n }\r\n this.dispatchChange();\r\n }\r\n\r\n clearFiles() {\r\n this.files = [];\r\n if (this.list) {\r\n this.list.remove();\r\n this.list = null;\r\n }\r\n if (this.preview) {\r\n this.preview.innerHTML = '';\r\n }\r\n this.clearError();\r\n this.dispatchChange();\r\n }\r\n\r\n showError(message) {\r\n this.clearError();\r\n this.dropzone.classList.add('is-error');\r\n \r\n const errorElement = document.createElement('div');\r\n errorElement.className = 'ds-fileupload__error';\r\n errorElement.textContent = message;\r\n errorElement.setAttribute('role', 'alert');\r\n errorElement.setAttribute('aria-live', 'polite');\r\n this.dropzone.appendChild(errorElement);\r\n \r\n setTimeout(() => {\r\n this.clearError();\r\n }, 5000);\r\n }\r\n\r\n clearError() {\r\n this.dropzone.classList.remove('is-error');\r\n const errorElement = this.dropzone.querySelector('.ds-fileupload__error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n }\r\n\r\n showPreview(file) {\r\n if (!file.type.startsWith('image/')) return;\r\n \r\n if (!this.preview) {\r\n this.preview = document.createElement('div');\r\n this.preview.className = 'ds-fileupload__preview';\r\n this.element.insertBefore(this.preview, this.list || null);\r\n }\r\n \r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const previewItem = document.createElement('div');\r\n previewItem.className = 'ds-fileupload__preview-item';\r\n previewItem.innerHTML = `\r\n <img src=\"${e.target.result}\" alt=\"${file.name}\">\r\n <button class=\"ds-fileupload__preview-remove\" type=\"button\" aria-label=\"Remove preview\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n `;\r\n \r\n const previewRemoveBtn = previewItem.querySelector('.ds-fileupload__preview-remove');\r\n const previewRemoveHandler = () => {\r\n this.removeFile(file, this.list?.querySelector(`[data-filename=\"${file.name}\"]`));\r\n previewItem.remove();\r\n if (this.preview && this.preview.children.length === 0) {\r\n this.preview.remove();\r\n this.preview = null;\r\n }\r\n };\r\n previewRemoveBtn.addEventListener('click', previewRemoveHandler);\r\n this._listeners.push({ el: previewRemoveBtn, event: 'click', handler: previewRemoveHandler });\r\n \r\n this.preview.appendChild(previewItem);\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n updateProgress(percent) {\r\n if (!this.progress) {\r\n this.progress = document.createElement('div');\r\n this.progress.className = 'ds-fileupload__progress';\r\n this.element.insertBefore(this.progress, this.list || null);\r\n }\r\n \r\n this.progress.style.display = 'block';\r\n \r\n const bar = this.progress.querySelector('.ds-fileupload__progress-bar') || document.createElement('div');\r\n bar.className = 'ds-fileupload__progress-bar';\r\n bar.style.width = `${percent}%`;\r\n \r\n if (!this.progress.querySelector('.ds-fileupload__progress-bar')) {\r\n this.progress.appendChild(bar);\r\n }\r\n \r\n if (percent >= 100) {\r\n setTimeout(() => {\r\n if (this.progress) {\r\n this.progress.remove();\r\n this.progress = null;\r\n }\r\n }, 500);\r\n }\r\n }\r\n\r\n simulateUpload(file) {\r\n this.updateProgress(0);\r\n const totalChunks = 100;\r\n let currentChunk = 0;\r\n const chunkSize = Math.max(1, Math.floor(file.size / totalChunks));\r\n \r\n const uploadInterval = setInterval(() => {\r\n currentChunk++;\r\n const percent = Math.min(100, Math.floor((currentChunk / totalChunks) * 100));\r\n this.updateProgress(percent);\r\n \r\n if (currentChunk >= totalChunks) {\r\n clearInterval(uploadInterval);\r\n this.updateProgress(100);\r\n }\r\n }, Math.max(50, Math.floor(5000 / totalChunks)));\r\n \r\n return uploadInterval;\r\n }\r\n\r\n getFiles() {\r\n return [...this.files];\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('ds-fileupload-change', {\r\n detail: {\r\n files: this.getFiles(),\r\n count: this.files.length\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.files = [];\r\n this.dropzone = null;\r\n this.input = null;\r\n this.list = null;\r\n this.progress = null;\r\n this.preview = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initFileUpload(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new FileUpload(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupFileUpload(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initFileUploads() {\r\n document.querySelectorAll('.ds-fileupload').forEach(el => {\r\n initFileUpload(el);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { FileUpload, initFileUploads, initFileUpload, cleanupFileUpload };\r\n} else {\r\n window.FileUpload = FileUpload;\r\n window.initFileUpload = initFileUpload;\r\n window.cleanupFileUpload = cleanupFileUpload;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('fileupload', initFileUpload, cleanupFileUpload);\r\n}","class Collapse {\r\n constructor(element) {\r\n this.element = element;\r\n this.headers = [];\r\n this._listeners = [];\r\n this._init();\r\n }\r\n\r\n _init() {\r\n const headers = this.element.querySelectorAll('.ds-collapse__header');\r\n \r\n headers.forEach(header => {\r\n const item = header.closest('.ds-collapse__item');\r\n const content = header.nextElementSibling;\r\n \r\n if (!item || !content || !content.classList.contains('ds-collapse__content')) return;\r\n \r\n const isActive = item.classList.contains('is-active');\r\n content.style.height = isActive ? content.scrollHeight + 'px' : '0';\r\n \r\n const clickHandler = () => {\r\n const isExpanded = content.style.height !== '0px';\r\n \r\n if (isExpanded) {\r\n content.style.height = '0';\r\n item.classList.remove('is-active');\r\n } else {\r\n content.style.height = content.scrollHeight + 'px';\r\n item.classList.add('is-active');\r\n \r\n const transitionHandler = function onTransitionEnd() {\r\n content.removeEventListener('transitionend', transitionHandler);\r\n content.style.height = '';\r\n };\r\n content.addEventListener('transitionend', transitionHandler);\r\n this._listeners.push({ el: content, event: 'transitionend', handler: transitionHandler });\r\n }\r\n };\r\n \r\n header.addEventListener('click', clickHandler);\r\n this.headers.push({ header, item, content, clickHandler });\r\n this._listeners.push({ el: header, event: 'click', handler: clickHandler });\r\n });\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.headers = null;\r\n this.element = null;\r\n }\r\n\r\n toggle(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n expand(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && !headerInfo.item.classList.contains('is-active')) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n collapse(index) {\r\n const headerInfo = this.headers[index];\r\n if (headerInfo && headerInfo.item.classList.contains('is-active')) {\r\n headerInfo.clickHandler();\r\n }\r\n }\r\n\r\n expandAll() {\r\n this.headers.forEach((headerInfo, index) => {\r\n if (!headerInfo.item.classList.contains('is-active')) {\r\n this.toggle(index);\r\n }\r\n });\r\n }\r\n\r\n collapseAll() {\r\n this.headers.forEach((headerInfo, index) => {\r\n if (headerInfo.item.classList.contains('is-active')) {\r\n this.toggle(index);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction initCollapse(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const collapse = new Collapse(element);\r\n element.__kupolaInstance = collapse;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupCollapse(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const collapse = element.__kupolaInstance;\r\n collapse.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCollapses() {\r\n document.querySelectorAll('.ds-collapse').forEach(collapse => {\r\n initCollapse(collapse);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Collapse, initCollapses, initCollapse, cleanupCollapse };\r\n} else {\r\n window.Collapse = Collapse;\r\n window.initCollapse = initCollapse;\r\n window.cleanupCollapse = cleanupCollapse;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('collapse', initCollapse, cleanupCollapse);\r\n}","class ColorPicker {\r\n constructor(element) {\r\n this.element = element;\r\n this.trigger = element.querySelector('.ds-color-picker__trigger');\r\n this.panel = element.querySelector('.ds-color-picker__panel');\r\n this.valueSpan = element.querySelector('.ds-color-picker__value');\r\n this.customInput = element.querySelector('.ds-color-picker__input');\r\n this.scope = `colorpicker-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._triggerClickHandler = null;\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._colorClickHandler = null;\r\n this._inputInputHandler = null;\r\n }\r\n\r\n init() {\r\n if (!this.trigger || !this.panel) return;\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._triggerClickHandler = (e) => {\r\n e.stopPropagation();\r\n this.togglePanel();\r\n };\r\n\r\n this._colorClickHandler = (e) => {\r\n const colorBtn = e.currentTarget;\r\n const color = colorBtn.getAttribute('data-color');\r\n this.updateColor(color);\r\n this.hidePanel();\r\n };\r\n\r\n this._inputInputHandler = (e) => {\r\n this.updateColor(e.target.value);\r\n };\r\n\r\n this._documentClickHandler = (e) => {\r\n if (!this.element.contains(e.target)) {\r\n this.hidePanel();\r\n }\r\n };\r\n\r\n this.trigger.addEventListener('click', this._triggerClickHandler);\r\n\r\n this.panel.querySelectorAll('.ds-color-picker__color').forEach(colorBtn => {\r\n colorBtn.addEventListener('click', this._colorClickHandler);\r\n colorBtn._colorPickerColorHandler = this._colorClickHandler;\r\n });\r\n\r\n if (this.customInput) {\r\n this.customInput.addEventListener('input', this._inputInputHandler);\r\n this.customInput._colorPickerInputHandler = this._inputInputHandler;\r\n }\r\n\r\n if (window.globalEvents) {\r\n this._documentClickListener = window.globalEvents.on(document, 'click', this._documentClickHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n togglePanel() {\r\n this.panel.classList.toggle('is-visible');\r\n }\r\n\r\n hidePanel() {\r\n this.panel.classList.remove('is-visible');\r\n }\r\n\r\n updateColor(color) {\r\n this.trigger.style.backgroundColor = color;\r\n if (this.valueSpan) {\r\n this.valueSpan.textContent = color.toUpperCase();\r\n }\r\n if (this.customInput) {\r\n this.customInput.value = color;\r\n }\r\n this.element.dispatchEvent(new CustomEvent('colorchange', { detail: { color } }));\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this.trigger && this._triggerClickHandler) {\r\n this.trigger.removeEventListener('click', this._triggerClickHandler);\r\n }\r\n\r\n if (this.panel) {\r\n this.panel.querySelectorAll('.ds-color-picker__color').forEach(colorBtn => {\r\n if (colorBtn._colorPickerColorHandler) {\r\n colorBtn.removeEventListener('click', colorBtn._colorPickerColorHandler);\r\n }\r\n });\r\n }\r\n\r\n if (this.customInput && this._inputInputHandler) {\r\n this.customInput.removeEventListener('input', this._inputInputHandler);\r\n }\r\n\r\n if (this._documentClickListener && this._documentClickListener.unsubscribe) {\r\n this._documentClickListener.unsubscribe();\r\n } else if (this._documentClickHandler) {\r\n document.removeEventListener('click', this._documentClickHandler);\r\n }\r\n\r\n this._documentClickHandler = null;\r\n this._documentClickListener = null;\r\n this._triggerClickHandler = null;\r\n this._colorClickHandler = null;\r\n this._inputInputHandler = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initColorPicker(element) {\r\n const picker = new ColorPicker(element);\r\n picker.init();\r\n element._kupolaColorPicker = picker;\r\n}\r\n\r\nfunction initColorPickers(root = document) {\r\n root.querySelectorAll('.ds-color-picker').forEach(picker => {\r\n initColorPicker(picker);\r\n });\r\n}\r\n\r\nfunction cleanupColorPicker(picker) {\r\n if (picker._kupolaColorPicker) {\r\n picker._kupolaColorPicker.destroy();\r\n picker._kupolaColorPicker = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllColorPickers() {\r\n document.querySelectorAll('.ds-color-picker').forEach(picker => {\r\n cleanupColorPicker(picker);\r\n });\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('color-picker', initColorPicker, cleanupColorPicker);\r\n}","class Calendar {\r\n constructor(element) {\r\n this.element = element;\r\n this.titleEl = element.querySelector('.ds-calendar__title');\r\n this.daysEl = element.querySelector('.ds-calendar__days');\r\n this.prevBtn = element.querySelector('.ds-calendar__nav--prev');\r\n this.nextBtn = element.querySelector('.ds-calendar__nav--next');\r\n this.todayBtn = element.querySelector('.ds-calendar__nav--today');\r\n this._listeners = [];\r\n \r\n if (!this.titleEl || !this.daysEl) {\r\n throw new Error('Calendar: Missing required elements');\r\n }\r\n\r\n this.currentDate = new Date();\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this.render();\r\n\r\n const prevHandler = () => {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n this.render();\r\n };\r\n\r\n const nextHandler = () => {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n this.render();\r\n };\r\n\r\n const todayHandler = () => {\r\n this.currentDate = new Date();\r\n this.render();\r\n };\r\n\r\n if (this.prevBtn) {\r\n this.prevBtn.addEventListener('click', prevHandler);\r\n this._listeners.push({ el: this.prevBtn, event: 'click', handler: prevHandler });\r\n }\r\n\r\n if (this.nextBtn) {\r\n this.nextBtn.addEventListener('click', nextHandler);\r\n this._listeners.push({ el: this.nextBtn, event: 'click', handler: nextHandler });\r\n }\r\n\r\n if (this.todayBtn) {\r\n this.todayBtn.addEventListener('click', todayHandler);\r\n this._listeners.push({ el: this.todayBtn, event: 'click', handler: todayHandler });\r\n }\r\n }\r\n\r\n render() {\r\n const year = this.currentDate.getFullYear();\r\n const month = this.currentDate.getMonth();\r\n \r\n this.titleEl.textContent = `${year} ${['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][month]}`;\r\n \r\n const firstDay = new Date(year, month, 1).getDay();\r\n const daysInMonth = new Date(year, month + 1, 0).getDate();\r\n \r\n this.daysEl.innerHTML = '';\r\n \r\n for (let i = 0; i < firstDay; i++) {\r\n const emptyDay = document.createElement('span');\r\n emptyDay.className = 'ds-calendar__day ds-calendar__day--empty';\r\n this.daysEl.appendChild(emptyDay);\r\n }\r\n \r\n const today = new Date();\r\n const todayStr = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, '0')}-${String(today.getDate()).padStart(2, '0')}`;\r\n \r\n for (let day = 1; day <= daysInMonth; day++) {\r\n const dayEl = document.createElement('button');\r\n dayEl.className = 'ds-calendar__day';\r\n dayEl.textContent = day;\r\n \r\n const dayStr = `${year}-${String(month + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\r\n \r\n if (dayStr === todayStr) {\r\n dayEl.classList.add('is-today');\r\n }\r\n \r\n const clickHandler = () => {\r\n this.element.querySelectorAll('.ds-calendar__day').forEach(d => d.classList.remove('is-selected'));\r\n dayEl.classList.add('is-selected');\r\n this.$emit('select', { date: new Date(year, month, day), dateStr: dayStr });\r\n };\r\n \r\n dayEl.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: dayEl, event: 'click', handler: clickHandler });\r\n \r\n this.daysEl.appendChild(dayEl);\r\n }\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.titleEl = null;\r\n this.daysEl = null;\r\n this.prevBtn = null;\r\n this.nextBtn = null;\r\n this.todayBtn = null;\r\n this.element = null;\r\n }\r\n\r\n setDate(date) {\r\n this.currentDate = new Date(date);\r\n this.render();\r\n }\r\n\r\n getDate() {\r\n return this.currentDate;\r\n }\r\n\r\n prevMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() - 1);\r\n this.render();\r\n }\r\n\r\n nextMonth() {\r\n this.currentDate.setMonth(this.currentDate.getMonth() + 1);\r\n this.render();\r\n }\r\n\r\n goToToday() {\r\n this.currentDate = new Date();\r\n this.render();\r\n }\r\n\r\n $emit(eventName, data) {\r\n if (this.element) {\r\n const customEvent = new CustomEvent(`kupola:calendar:${eventName}`, {\r\n detail: data,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n this.element.dispatchEvent(customEvent);\r\n }\r\n }\r\n}\r\n\r\nfunction initCalendar(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const calendar = new Calendar(element);\r\n element.__kupolaInstance = calendar;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[Calendar] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupCalendar(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const calendar = element.__kupolaInstance;\r\n calendar.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCalendars() {\r\n document.querySelectorAll('.ds-calendar').forEach(calendar => {\r\n initCalendar(calendar);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Calendar, initCalendars, initCalendar, cleanupCalendar };\r\n} else {\r\n window.Calendar = Calendar;\r\n window.initCalendar = initCalendar;\r\n window.cleanupCalendar = cleanupCalendar;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('calendar', initCalendar, cleanupCalendar);\r\n}","class DynamicTags {\r\n constructor(element) {\r\n this.element = element;\r\n this.input = element.querySelector('.ds-dynamic-tags__input');\r\n this._listeners = [];\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n this.element.querySelectorAll('.ds-dynamic-tags__remove').forEach(removeBtn => {\r\n const removeHandler = (e) => {\r\n e.stopPropagation();\r\n const tag = removeBtn.closest('.ds-dynamic-tags__tag');\r\n if (tag) {\r\n tag.remove();\r\n this.dispatchChange();\r\n }\r\n };\r\n removeBtn.addEventListener('click', removeHandler);\r\n this._listeners.push({ el: removeBtn, event: 'click', handler: removeHandler });\r\n });\r\n\r\n if (this.input) {\r\n const addTag = () => {\r\n const value = this.input.value.trim();\r\n if (!value) return;\r\n\r\n const tag = document.createElement('span');\r\n tag.className = 'ds-dynamic-tags__tag';\r\n const textNode = document.createTextNode(value);\r\n tag.appendChild(textNode);\r\n const removeBtn = document.createElement('button');\r\n removeBtn.className = 'ds-dynamic-tags__remove';\r\n removeBtn.innerHTML = '<svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\r\n tag.appendChild(removeBtn);\r\n\r\n const tagRemoveHandler = (e) => {\r\n e.stopPropagation();\r\n tag.remove();\r\n this.dispatchChange();\r\n };\r\n removeBtn.addEventListener('click', tagRemoveHandler);\r\n this._listeners.push({ el: removeBtn, event: 'click', handler: tagRemoveHandler });\r\n\r\n this.element.insertBefore(tag, this.input);\r\n this.input.value = '';\r\n this.input.focus();\r\n this.dispatchChange();\r\n };\r\n\r\n const keydownHandler = (e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n addTag();\r\n }\r\n };\r\n this.input.addEventListener('keydown', keydownHandler);\r\n this._listeners.push({ el: this.input, event: 'keydown', handler: keydownHandler });\r\n\r\n const clickHandler = () => {\r\n this.input.focus();\r\n };\r\n this.element.addEventListener('click', clickHandler);\r\n this._listeners.push({ el: this.element, event: 'click', handler: clickHandler });\r\n }\r\n }\r\n\r\n addTag(value) {\r\n if (!value || !this.input) return;\r\n this.input.value = value;\r\n this.input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter' }));\r\n }\r\n\r\n removeTag(index) {\r\n const tags = this.element.querySelectorAll('.ds-dynamic-tags__tag');\r\n const tag = tags[index];\r\n if (tag) {\r\n tag.remove();\r\n this.dispatchChange();\r\n }\r\n }\r\n\r\n getTags() {\r\n const tags = [];\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n tags.push(tag.textContent);\r\n });\r\n return tags;\r\n }\r\n\r\n clearTags() {\r\n this.element.querySelectorAll('.ds-dynamic-tags__tag').forEach(tag => {\r\n tag.remove();\r\n });\r\n this.dispatchChange();\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('ds-dynamic-tags-change', {\r\n detail: {\r\n tags: this.getTags(),\r\n count: this.getTags().length\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.input = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initDynamicTags(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new DynamicTags(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupDynamicTags(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initDynamicTagsAll() {\r\n document.querySelectorAll('.ds-dynamic-tags').forEach(tags => {\r\n initDynamicTags(tags);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { DynamicTags, initDynamicTagsAll, initDynamicTags, cleanupDynamicTags };\r\n} else {\r\n window.DynamicTags = DynamicTags;\r\n window.initDynamicTags = initDynamicTags;\r\n window.cleanupDynamicTags = cleanupDynamicTags;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('dynamic-tags', initDynamicTags, cleanupDynamicTags);\r\n}","class ImagePreview {\r\n constructor(options = {}) {\r\n this.images = options.images || [];\r\n this.currentIndex = options.currentIndex || 0;\r\n this.overlay = null;\r\n this.closeHandler = this.close.bind(this);\r\n this.keyHandler = this.handleKeydown.bind(this);\r\n this.clickHandler = this.handleOverlayClick.bind(this);\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.createOverlay();\r\n }\r\n\r\n createOverlay() {\r\n this.overlay = document.createElement('div');\r\n this.overlay.className = 'ds-image-preview-overlay';\r\n this.overlay.innerHTML = `\r\n <button class=\"ds-image-preview__close\" type=\"button\" aria-label=\"Close preview\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M18 6L6 18\"/>\r\n <path d=\"M6 6l12 12\"/>\r\n </svg>\r\n </button>\r\n <div class=\"ds-image-preview__nav\">\r\n <button class=\"ds-image-preview__nav-btn ds-image-preview__nav-btn--prev\" type=\"button\" aria-label=\"Previous image\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"15 18 9 12 15 6\"/>\r\n </svg>\r\n </button>\r\n <button class=\"ds-image-preview__nav-btn ds-image-preview__nav-btn--next\" type=\"button\" aria-label=\"Next image\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"9 18 15 12 9 6\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"ds-image-preview__content\">\r\n <img src=\"\" alt=\"\" />\r\n </div>\r\n <div class=\"ds-image-preview__info\">\r\n <div class=\"ds-image-preview__title\"></div>\r\n <div class=\"ds-image-preview__meta\"></div>\r\n </div>\r\n <div class=\"ds-image-preview__indicators\"></div>\r\n `;\r\n \r\n document.body.appendChild(this.overlay);\r\n \r\n this.bindEvents();\r\n }\r\n\r\n bindEvents() {\r\n const closeBtn = this.overlay.querySelector('.ds-image-preview__close');\r\n const prevBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n this._prevHandler = () => this.prev();\r\n this._nextHandler = () => this.next();\r\n \r\n closeBtn.addEventListener('click', this.closeHandler);\r\n prevBtn.addEventListener('click', this._prevHandler);\r\n nextBtn.addEventListener('click', this._nextHandler);\r\n }\r\n\r\n handleKeydown(e) {\r\n if (!this.overlay.classList.contains('is-visible')) return;\r\n \r\n switch (e.key) {\r\n case 'Escape':\r\n this.close();\r\n break;\r\n case 'ArrowLeft':\r\n this.prev();\r\n break;\r\n case 'ArrowRight':\r\n this.next();\r\n break;\r\n }\r\n }\r\n\r\n handleOverlayClick(e) {\r\n if (e.target === this.overlay) {\r\n this.close();\r\n }\r\n }\r\n\r\n show(images, index = 0) {\r\n this.images = images;\r\n this.currentIndex = Math.min(Math.max(index, 0), images.length - 1);\r\n \r\n this.render();\r\n this.overlay.classList.add('is-visible');\r\n \r\n document.addEventListener('keydown', this.keyHandler);\r\n this.overlay.addEventListener('click', this.clickHandler);\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n close() {\r\n this.overlay.classList.remove('is-visible');\r\n \r\n document.removeEventListener('keydown', this.keyHandler);\r\n this.overlay.removeEventListener('click', this.clickHandler);\r\n document.body.style.overflow = '';\r\n }\r\n\r\n prev() {\r\n if (this.currentIndex > 0) {\r\n this.currentIndex--;\r\n this.render();\r\n }\r\n }\r\n\r\n next() {\r\n if (this.currentIndex < this.images.length - 1) {\r\n this.currentIndex++;\r\n this.render();\r\n }\r\n }\r\n\r\n goTo(index) {\r\n if (index >= 0 && index < this.images.length) {\r\n this.currentIndex = index;\r\n this.render();\r\n }\r\n }\r\n\r\n render() {\r\n const img = this.overlay.querySelector('.ds-image-preview__content img');\r\n const title = this.overlay.querySelector('.ds-image-preview__title');\r\n const meta = this.overlay.querySelector('.ds-image-preview__meta');\r\n const indicators = this.overlay.querySelector('.ds-image-preview__indicators');\r\n const prevBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n const currentImage = this.images[this.currentIndex];\r\n \r\n img.src = currentImage.src;\r\n img.alt = currentImage.alt || '';\r\n title.textContent = currentImage.title || '';\r\n meta.textContent = currentImage.meta || `${this.currentIndex + 1} / ${this.images.length}`;\r\n \r\n prevBtn.disabled = this.currentIndex === 0;\r\n nextBtn.disabled = this.currentIndex === this.images.length - 1;\r\n \r\n indicators.innerHTML = this.images.map((_, i) => `\r\n <button class=\"ds-image-preview__indicator${i === this.currentIndex ? ' is-active' : ''}\" type=\"button\" data-index=\"${i}\" aria-label=\"Go to image ${i + 1}\"></button>\r\n `).join('');\r\n \r\n indicators.querySelectorAll('.ds-image-preview__indicator').forEach(indicator => {\r\n const clickHandler = () => {\r\n this.goTo(parseInt(indicator.dataset.index));\r\n };\r\n indicator.addEventListener('click', clickHandler);\r\n indicator._clickHandler = clickHandler;\r\n });\r\n }\r\n\r\n destroy() {\r\n this.close();\r\n \r\n const indicators = this.overlay?.querySelector('.ds-image-preview__indicators');\r\n if (indicators) {\r\n indicators.querySelectorAll('.ds-image-preview__indicator').forEach(indicator => {\r\n if (indicator._clickHandler) {\r\n indicator.removeEventListener('click', indicator._clickHandler);\r\n }\r\n });\r\n }\r\n \r\n const closeBtn = this.overlay?.querySelector('.ds-image-preview__close');\r\n const prevBtn = this.overlay?.querySelector('.ds-image-preview__nav-btn--prev');\r\n const nextBtn = this.overlay?.querySelector('.ds-image-preview__nav-btn--next');\r\n \r\n if (closeBtn) {\r\n closeBtn.removeEventListener('click', this.closeHandler);\r\n }\r\n if (prevBtn && this._prevHandler) {\r\n prevBtn.removeEventListener('click', this._prevHandler);\r\n }\r\n if (nextBtn && this._nextHandler) {\r\n nextBtn.removeEventListener('click', this._nextHandler);\r\n }\r\n \r\n if (this.overlay && this.overlay.parentNode) {\r\n this.overlay.parentNode.removeChild(this.overlay);\r\n }\r\n }\r\n}\r\n\r\nlet imagePreviewInstance = null;\r\n\r\nfunction initImagePreview() {\r\n if (!imagePreviewInstance) {\r\n imagePreviewInstance = new ImagePreview();\r\n }\r\n \r\n document.querySelectorAll('[data-image-preview]').forEach(trigger => {\r\n trigger.addEventListener('click', () => {\r\n const images = JSON.parse(trigger.getAttribute('data-image-preview'));\r\n const index = parseInt(trigger.getAttribute('data-image-index')) || 0;\r\n imagePreviewInstance.show(images, index);\r\n });\r\n });\r\n}\r\n\r\nfunction showImagePreview(images, index = 0) {\r\n if (!imagePreviewInstance) {\r\n imagePreviewInstance = new ImagePreview();\r\n }\r\n imagePreviewInstance.show(images, index);\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { ImagePreview, initImagePreview, showImagePreview };\r\n}","class Tag {\r\n constructor(element) {\r\n this.element = element;\r\n this.closeBtn = element.querySelector('.ds-tag__close');\r\n this._listeners = [];\r\n this.init();\r\n }\r\n\r\n init() {\r\n if (this.closeBtn) {\r\n const closeHandler = (e) => {\r\n e.stopPropagation();\r\n this.element.dispatchEvent(new CustomEvent('ds-tag-remove', {\r\n detail: { tag: this.element },\r\n bubbles: true\r\n }));\r\n this.element.remove();\r\n };\r\n this.closeBtn.addEventListener('click', closeHandler);\r\n this._listeners.push({ el: this.closeBtn, event: 'click', handler: closeHandler });\r\n }\r\n }\r\n\r\n setContent(content) {\r\n const textNodes = [];\r\n this.element.childNodes.forEach(node => {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n textNodes.push(node);\r\n }\r\n });\r\n textNodes.forEach(node => node.remove());\r\n this.element.insertBefore(document.createTextNode(content), this.closeBtn || null);\r\n }\r\n\r\n getContent() {\r\n return this.element.textContent.trim();\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.closeBtn = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initTag(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new Tag(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupTag(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initTags() {\r\n document.querySelectorAll('.ds-tag').forEach(tag => {\r\n initTag(tag);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Tag, initTags, initTag, cleanupTag };\r\n} else {\r\n window.Tag = Tag;\r\n window.initTag = initTag;\r\n window.cleanupTag = cleanupTag;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('tag', initTag, cleanupTag);\r\n}","class StatCard {\r\n constructor(element) {\r\n this.element = element;\r\n this.valueElement = element.querySelector('.ds-statcard__value');\r\n this.progressFill = element.querySelector('.ds-statcard__progress-fill');\r\n this.animated = false;\r\n this._observer = null;\r\n \r\n this.init();\r\n }\r\n\r\n init() {\r\n this.animateValue();\r\n this.animateProgress();\r\n \r\n this._observer = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting && !this.animated) {\r\n this.animateValue();\r\n this.animateProgress();\r\n this.animated = true;\r\n }\r\n });\r\n }, { threshold: 0.3 });\r\n \r\n this._observer.observe(this.element);\r\n }\r\n\r\n animateValue() {\r\n if (!this.valueElement) return;\r\n \r\n const text = this.valueElement.textContent;\r\n const match = text.match(/[\\d.,]+/);\r\n if (!match) return;\r\n \r\n const targetValue = parseFloat(match[0].replace(',', ''));\r\n const prefix = text.substring(0, match.index);\r\n const suffix = text.substring(match.index + match[0].length);\r\n \r\n const duration = 1500;\r\n const startTime = performance.now();\r\n const startValue = 0;\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentValue = startValue + (targetValue - startValue) * easeProgress;\r\n \r\n let formattedValue;\r\n if (targetValue >= 1000000) {\r\n formattedValue = (currentValue / 1000000).toFixed(1) + 'M';\r\n } else if (targetValue >= 1000) {\r\n formattedValue = (currentValue / 1000).toFixed(1) + 'K';\r\n } else if (Number.isInteger(targetValue)) {\r\n formattedValue = Math.floor(currentValue).toLocaleString();\r\n } else {\r\n formattedValue = currentValue.toFixed(2);\r\n }\r\n \r\n this.valueElement.textContent = prefix + formattedValue + suffix;\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n animateProgress() {\r\n if (!this.progressFill) return;\r\n \r\n const width = this.progressFill.getAttribute('data-width') || '0%';\r\n this.progressFill.style.width = width;\r\n }\r\n\r\n updateValue(newValue, options = {}) {\r\n if (!this.valueElement) return;\r\n \r\n const duration = options.duration || 800;\r\n const text = this.valueElement.textContent;\r\n const match = text.match(/[\\d.,]+/);\r\n \r\n if (!match) {\r\n this.valueElement.textContent = newValue;\r\n return;\r\n }\r\n \r\n const prefix = text.substring(0, match.index);\r\n const suffix = text.substring(match.index + match[0].length);\r\n const startValue = parseFloat(match[0].replace(',', ''));\r\n const targetValue = parseFloat(newValue);\r\n \r\n const startTime = performance.now();\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentValue = startValue + (targetValue - startValue) * easeProgress;\r\n \r\n let formattedValue;\r\n if (targetValue >= 1000000) {\r\n formattedValue = (currentValue / 1000000).toFixed(1) + 'M';\r\n } else if (targetValue >= 1000) {\r\n formattedValue = (currentValue / 1000).toFixed(1) + 'K';\r\n } else if (Number.isInteger(targetValue)) {\r\n formattedValue = Math.floor(currentValue).toLocaleString();\r\n } else {\r\n formattedValue = currentValue.toFixed(2);\r\n }\r\n \r\n this.valueElement.textContent = prefix + formattedValue + suffix;\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n updateProgress(percent, options = {}) {\r\n if (!this.progressFill) return;\r\n \r\n const duration = options.duration || 600;\r\n const currentWidth = parseFloat(this.progressFill.style.width || '0');\r\n const targetWidth = Math.min(Math.max(percent, 0), 100);\r\n \r\n const startTime = performance.now();\r\n \r\n const animate = (currentTime) => {\r\n const elapsed = currentTime - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n const easeProgress = 1 - Math.pow(1 - progress, 3);\r\n \r\n const currentWidthValue = currentWidth + (targetWidth - currentWidth) * easeProgress;\r\n this.progressFill.style.width = currentWidthValue + '%';\r\n \r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n \r\n requestAnimationFrame(animate);\r\n }\r\n\r\n setTrend(direction, value) {\r\n const trendElement = this.element.querySelector('.ds-statcard__trend');\r\n if (!trendElement) return;\r\n \r\n trendElement.className = `ds-statcard__trend ds-statcard__trend--${direction}`;\r\n \r\n const iconSvg = direction === 'up' \r\n ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 6 13.5 15.5 8.5 10.5 1 18\"/></svg>'\r\n : direction === 'down'\r\n ? '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"1 18 10.5 8.5 15.5 13.5 23 6\"/></svg>'\r\n : '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"12 19 18 13 12 7 6 13\"/></svg>';\r\n \r\n trendElement.innerHTML = iconSvg + value;\r\n }\r\n\r\n destroy() {\r\n if (this._observer) {\r\n this._observer.disconnect();\r\n this._observer = null;\r\n }\r\n this.animated = false;\r\n this.valueElement = null;\r\n this.progressFill = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initStatCard(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new StatCard(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupStatCard(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initStatCards() {\r\n document.querySelectorAll('.ds-statcard').forEach(card => {\r\n initStatCard(card);\r\n });\r\n}\r\n\r\nfunction updateStatCard(selector, newValue) {\r\n const card = document.querySelector(selector);\r\n if (card && card.__kupolaInstance) {\r\n card.__kupolaInstance.updateValue(newValue);\r\n }\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { StatCard, initStatCards, initStatCard, cleanupStatCard, updateStatCard };\r\n} else {\r\n window.StatCard = StatCard;\r\n window.initStatCard = initStatCard;\r\n window.cleanupStatCard = cleanupStatCard;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('statcard', initStatCard, cleanupStatCard);\r\n}","class Heatmap {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.data = options.data || [];\r\n this.startDate = options.startDate || this.getOneYearAgo();\r\n this.endDate = options.endDate || new Date();\r\n this.cellSize = options.cellSize || 14;\r\n this.onCellClick = options.onCellClick || null;\r\n this.tooltip = null;\r\n this.baseColor = options.color || element.getAttribute('data-color') || '#22c55e';\r\n this._listeners = [];\r\n \r\n this.init();\r\n }\r\n\r\n getOneYearAgo() {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() - 1);\r\n return date;\r\n }\r\n\r\n init() {\r\n this.render();\r\n this.createTooltip();\r\n }\r\n\r\n getDataByDate(date) {\r\n const dateStr = this.formatDate(date);\r\n const item = this.data.find(d => d.date === dateStr);\r\n return item ? item.value : 0;\r\n }\r\n\r\n formatDate(date) {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n getLevel(value, maxValue) {\r\n if (value === 0) return 0;\r\n if (!maxValue || maxValue === 0) maxValue = Math.max(...this.data.map(d => d.value), 1);\r\n const ratio = value / maxValue;\r\n if (ratio < 0.2) return 1;\r\n if (ratio < 0.4) return 2;\r\n if (ratio < 0.6) return 3;\r\n if (ratio < 0.8) return 4;\r\n return 5;\r\n }\r\n\r\n hexToRgb(hex) {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : { r: 34, g: 197, b: 94 };\r\n }\r\n\r\n getCellColor(level) {\r\n const rgb = this.hexToRgb(this.baseColor);\r\n if (level === 0) return 'rgba(0, 0, 0, 0.1)';\r\n const opacity = [0.2, 0.4, 0.6, 0.8, 1][level - 1];\r\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;\r\n }\r\n\r\n getWeekdayLabels() {\r\n return ['', '一', '', '三', '', '五', ''];\r\n }\r\n\r\n getMonthLabels() {\r\n const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];\r\n const result = [];\r\n let currentMonth = -1;\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n const month = d.getMonth();\r\n const day = d.getDate();\r\n if (month !== currentMonth && day === 1) {\r\n result.push({ month, label: months[month], offset: Math.floor((d - this.startDate) / (1000 * 60 * 60 * 24)) });\r\n currentMonth = month;\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n getWeekCount() {\r\n let weeks = 0;\r\n let firstDate = new Date(this.startDate);\r\n const firstDayOfWeek = firstDate.getDay();\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n if (d.getDay() === 0) {\r\n weeks++;\r\n }\r\n }\r\n \r\n if (firstDayOfWeek !== 0) {\r\n weeks++;\r\n }\r\n \r\n return weeks;\r\n }\r\n\r\n render() {\r\n const body = this.element.querySelector('.ds-heatmap__body');\r\n if (!body) return;\r\n \r\n body.innerHTML = '';\r\n \r\n const weeks = [];\r\n let currentWeek = [];\r\n \r\n let firstDate = new Date(this.startDate);\r\n const firstDayOfWeek = firstDate.getDay();\r\n for (let i = 1; i < firstDayOfWeek; i++) {\r\n currentWeek.push(null);\r\n }\r\n \r\n for (let d = new Date(this.startDate); d <= this.endDate; d.setDate(d.getDate() + 1)) {\r\n currentWeek.push(new Date(d));\r\n if (d.getDay() === 6 || d.getTime() === this.endDate.getTime()) {\r\n weeks.push(currentWeek);\r\n currentWeek = [];\r\n }\r\n }\r\n \r\n const weekCount = weeks.length;\r\n const cellWidth = this.element.classList.contains('ds-heatmap--compact') ? 12 : 16;\r\n const totalGridWidth = weekCount * cellWidth;\r\n \r\n const container = document.createElement('div');\r\n container.className = 'ds-heatmap__container';\r\n \r\n const labelsAndGrid = document.createElement('div');\r\n labelsAndGrid.className = 'ds-heatmap__labels-and-grid';\r\n \r\n const weekdayLabels = document.createElement('div');\r\n weekdayLabels.className = 'ds-heatmap__weekday-labels';\r\n const weekdayLabelHeight = this.element.classList.contains('ds-heatmap--compact') ? 12 : 16;\r\n this.getWeekdayLabels().forEach(label => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-heatmap__weekday-label';\r\n el.textContent = label;\r\n el.style.height = weekdayLabelHeight + 'px';\r\n el.style.lineHeight = weekdayLabelHeight + 'px';\r\n weekdayLabels.appendChild(el);\r\n });\r\n labelsAndGrid.appendChild(weekdayLabels);\r\n \r\n const gridContainer = document.createElement('div');\r\n gridContainer.className = 'ds-heatmap__grid-container';\r\n \r\n const monthLabels = document.createElement('div');\r\n monthLabels.className = 'ds-heatmap__month-labels';\r\n monthLabels.style.width = totalGridWidth + 'px';\r\n \r\n const monthInfo = this.getMonthLabels();\r\n monthInfo.forEach((item, index) => {\r\n const el = document.createElement('div');\r\n el.className = 'ds-heatmap__month-label';\r\n el.textContent = item.label;\r\n \r\n const nextMonth = monthInfo[index + 1];\r\n let weekSpan;\r\n if (nextMonth) {\r\n weekSpan = Math.ceil((nextMonth.offset - item.offset) / 7);\r\n } else {\r\n weekSpan = weekCount - Math.floor(item.offset / 7);\r\n }\r\n \r\n el.style.width = (weekSpan * cellWidth) + 'px';\r\n monthLabels.appendChild(el);\r\n });\r\n gridContainer.appendChild(monthLabels);\r\n \r\n const grid = document.createElement('div');\r\n grid.className = 'ds-heatmap__grid';\r\n \r\n weeks.forEach((week) => {\r\n const weekColumn = document.createElement('div');\r\n weekColumn.className = 'ds-heatmap__week-column';\r\n \r\n week.forEach(date => {\r\n if (date === null) {\r\n const emptyCell = document.createElement('div');\r\n emptyCell.className = 'ds-heatmap__cell';\r\n emptyCell.style.visibility = 'hidden';\r\n weekColumn.appendChild(emptyCell);\r\n } else {\r\n const value = this.getDataByDate(date);\r\n const maxValue = Math.max(...this.data.map(d => d.value), 1);\r\n const level = this.getLevel(value, maxValue);\r\n \r\n const cell = document.createElement('div');\r\n cell.className = 'ds-heatmap__cell';\r\n cell.dataset.date = this.formatDate(date);\r\n cell.dataset.value = value;\r\n cell.style.backgroundColor = this.getCellColor(level);\r\n \r\n const mouseenterHandler = (e) => this.showTooltip(e, date, value);\r\n const mouseleaveHandler = () => this.hideTooltip();\r\n const clickHandler = () => {\r\n if (this.onCellClick) {\r\n this.onCellClick({ date: this.formatDate(date), value });\r\n }\r\n };\r\n \r\n cell.addEventListener('mouseenter', mouseenterHandler);\r\n cell.addEventListener('mouseleave', mouseleaveHandler);\r\n cell.addEventListener('click', clickHandler);\r\n \r\n this._listeners.push(\r\n { el: cell, event: 'mouseenter', handler: mouseenterHandler },\r\n { el: cell, event: 'mouseleave', handler: mouseleaveHandler },\r\n { el: cell, event: 'click', handler: clickHandler }\r\n );\r\n \r\n weekColumn.appendChild(cell);\r\n }\r\n });\r\n \r\n grid.appendChild(weekColumn);\r\n });\r\n \r\n gridContainer.appendChild(grid);\r\n labelsAndGrid.appendChild(gridContainer);\r\n container.appendChild(labelsAndGrid);\r\n \r\n body.appendChild(container);\r\n this.renderLegend(body);\r\n }\r\n\r\n renderLegend(parent) {\r\n const legend = document.createElement('div');\r\n legend.className = 'ds-heatmap__legend';\r\n \r\n const label = document.createElement('span');\r\n label.className = 'ds-heatmap__legend-label';\r\n label.textContent = '少';\r\n \r\n const cells = document.createElement('div');\r\n cells.className = 'ds-heatmap__legend-cells';\r\n \r\n for (let i = 0; i <= 5; i++) {\r\n const cell = document.createElement('div');\r\n cell.className = 'ds-heatmap__legend-cell';\r\n cell.style.backgroundColor = this.getCellColor(i);\r\n cells.appendChild(cell);\r\n }\r\n \r\n const label2 = document.createElement('span');\r\n label2.className = 'ds-heatmap__legend-label';\r\n label2.textContent = '多';\r\n \r\n legend.appendChild(label);\r\n legend.appendChild(cells);\r\n legend.appendChild(label2);\r\n parent.appendChild(legend);\r\n }\r\n\r\n createTooltip() {\r\n this.tooltip = document.createElement('div');\r\n this.tooltip.className = 'ds-heatmap__tooltip';\r\n document.body.appendChild(this.tooltip);\r\n }\r\n\r\n showTooltip(e, date, value) {\r\n const rect = e.target.getBoundingClientRect();\r\n const tooltipWidth = 150;\r\n \r\n this.tooltip.innerHTML = `\r\n <div class=\"ds-heatmap__tooltip-date\">${date.getFullYear()}年${date.getMonth() + 1}月${date.getDate()}日</div>\r\n <div class=\"ds-heatmap__tooltip-value\">${value} contributions</div>\r\n `;\r\n \r\n this.tooltip.style.left = Math.min(rect.left + rect.width / 2 - tooltipWidth / 2, window.innerWidth - tooltipWidth - 16) + 'px';\r\n this.tooltip.style.top = (rect.top - 50) + 'px';\r\n this.tooltip.classList.add('is-visible');\r\n }\r\n\r\n hideTooltip() {\r\n this.tooltip.classList.remove('is-visible');\r\n }\r\n\r\n updateData(data) {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = [];\r\n this.data = data;\r\n this.render();\r\n }\r\n\r\n setDateRange(startDate, endDate) {\r\n this.startDate = startDate;\r\n this.endDate = endDate;\r\n this.render();\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n \r\n if (this.tooltip && this.tooltip.parentNode) {\r\n this.tooltip.parentNode.removeChild(this.tooltip);\r\n }\r\n this.tooltip = null;\r\n this.data = [];\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initHeatmap(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const dataAttr = element.getAttribute('data-heatmap-data');\r\n let data = [];\r\n \r\n if (dataAttr) {\r\n try {\r\n data = JSON.parse(dataAttr);\r\n } catch (e) {\r\n data = generateMockHeatmapData();\r\n }\r\n } else {\r\n data = generateMockHeatmapData();\r\n }\r\n \r\n const instance = new Heatmap(element, {\r\n data: data,\r\n onCellClick: (info) => {\r\n }\r\n });\r\n \r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupHeatmap(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initHeatmaps() {\r\n document.querySelectorAll('.ds-heatmap').forEach(element => {\r\n initHeatmap(element);\r\n });\r\n}\r\n\r\nfunction generateMockHeatmapData() {\r\n const data = [];\r\n const today = new Date();\r\n const oneYearAgo = new Date();\r\n oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);\r\n \r\n for (let d = new Date(oneYearAgo); d <= today; d.setDate(d.getDate() + 1)) {\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n \r\n const isWeekend = d.getDay() === 0 || d.getDay() === 6;\r\n const baseValue = isWeekend ? Math.random() * 20 : Math.random() * 50;\r\n const value = Math.floor(baseValue);\r\n \r\n data.push({\r\n date: `${year}-${month}-${day}`,\r\n value: value > 0 ? value : Math.floor(Math.random() * 30) + 1\r\n });\r\n }\r\n \r\n return data;\r\n}\r\n\r\nfunction createHeatmap(selector, options = {}) {\r\n const element = document.querySelector(selector);\r\n if (element) {\r\n const data = options.data || generateMockHeatmapData();\r\n return new Heatmap(element, {\r\n data: data,\r\n ...options\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Heatmap, initHeatmaps, initHeatmap, cleanupHeatmap, createHeatmap, generateMockHeatmapData };\r\n} else {\r\n window.Heatmap = Heatmap;\r\n window.initHeatmap = initHeatmap;\r\n window.cleanupHeatmap = cleanupHeatmap;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('heatmap', initHeatmap, cleanupHeatmap);\r\n}","class Tooltip {\r\n constructor(element) {\r\n this.element = element;\r\n this.tooltipEl = null;\r\n \r\n this._showTooltip = null;\r\n this._hideTooltip = null;\r\n }\r\n\r\n init() {\r\n if (this.element.__kupolaInitialized) return;\r\n\r\n this._showTooltip = () => {\r\n const text = this.element.getAttribute('data-tooltip');\r\n const position = this.element.getAttribute('data-tooltip-position') || 'top';\r\n if (!text) return;\r\n \r\n this.tooltipEl = document.createElement('div');\r\n this.tooltipEl.className = 'ds-tooltip is-visible';\r\n this.tooltipEl.textContent = text;\r\n \r\n document.body.appendChild(this.tooltipEl);\r\n \r\n requestAnimationFrame(() => {\r\n const rect = this.element.getBoundingClientRect();\r\n const tooltipRect = this.tooltipEl.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n let left, top;\r\n \r\n switch (position) {\r\n case 'bottom':\r\n left = rect.left + rect.width / 2 - tooltipRect.width / 2;\r\n top = rect.bottom + 8;\r\n break;\r\n case 'right':\r\n left = rect.right + 8;\r\n top = rect.top + rect.height / 2 - tooltipRect.height / 2;\r\n break;\r\n case 'left':\r\n left = rect.left - tooltipRect.width - 8;\r\n top = rect.top + rect.height / 2 - tooltipRect.height / 2;\r\n break;\r\n case 'top':\r\n default:\r\n left = rect.left + rect.width / 2 - tooltipRect.width / 2;\r\n top = rect.top - tooltipRect.height - 8;\r\n break;\r\n }\r\n \r\n if (left < 8) left = 8;\r\n if (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 8;\r\n if (top < 8) top = 8;\r\n if (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 8;\r\n \r\n this.tooltipEl.style.left = `${left}px`;\r\n this.tooltipEl.style.top = `${top}px`;\r\n this.tooltipEl.style.position = 'fixed';\r\n });\r\n };\r\n\r\n this._hideTooltip = () => {\r\n if (this.tooltipEl) {\r\n this.tooltipEl.remove();\r\n this.tooltipEl = null;\r\n }\r\n };\r\n\r\n this.element.addEventListener('mouseenter', this._showTooltip);\r\n this.element.addEventListener('mouseleave', this._hideTooltip);\r\n this.element.addEventListener('focus', this._showTooltip);\r\n this.element.addEventListener('blur', this._hideTooltip);\r\n \r\n this.element.__kupolaInitialized = true;\r\n }\r\n\r\n destroy() {\r\n if (!this.element.__kupolaInitialized) return;\r\n\r\n if (this._showTooltip) {\r\n this.element.removeEventListener('mouseenter', this._showTooltip);\r\n this.element.removeEventListener('focus', this._showTooltip);\r\n }\r\n \r\n if (this._hideTooltip) {\r\n this.element.removeEventListener('mouseleave', this._hideTooltip);\r\n this.element.removeEventListener('blur', this._hideTooltip);\r\n }\r\n \r\n if (this._showTooltip && this._hideTooltip) {\r\n this._hideTooltip();\r\n }\r\n \r\n this._showTooltip = null;\r\n this._hideTooltip = null;\r\n this.element.__kupolaInitialized = false;\r\n }\r\n}\r\n\r\nfunction initTooltip(element) {\r\n const tooltip = new Tooltip(element);\r\n tooltip.init();\r\n element._kupolaTooltip = tooltip;\r\n}\r\n\r\nfunction initTooltips(root = document) {\r\n root.querySelectorAll('[data-tooltip]').forEach(element => {\r\n initTooltip(element);\r\n });\r\n}\r\n\r\nfunction cleanupTooltip(element) {\r\n if (element._kupolaTooltip) {\r\n element._kupolaTooltip.destroy();\r\n element._kupolaTooltip = null;\r\n }\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('tooltip', initTooltip, cleanupTooltip);\r\n}","class KupolaValidator {\r\n constructor() {\r\n this.validators = {\r\n required: this.validateRequired,\r\n email: this.validateEmail,\r\n url: this.validateUrl,\r\n minLength: this.validateMinLength,\r\n maxLength: this.validateMaxLength,\r\n pattern: this.validatePattern,\r\n min: this.validateMin,\r\n max: this.validateMax,\r\n equalTo: this.validateEqualTo,\r\n phone: this.validatePhone,\r\n date: this.validateDate,\r\n number: this.validateNumber\r\n };\r\n \r\n this.customValidators = {};\r\n this.asyncValidators = {};\r\n this.customAsyncValidators = {};\r\n this.formStates = {};\r\n this.submitting = new Set();\r\n }\r\n\r\n addValidator(name, callback) {\r\n this.customValidators[name] = callback;\r\n }\r\n\r\n addAsyncValidator(name, callback) {\r\n this.customAsyncValidators[name] = callback;\r\n }\r\n\r\n validate(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n const errors = {};\r\n const inputs = form.querySelectorAll('[data-validate]');\r\n let hasError = false;\r\n \r\n inputs.forEach(input => {\r\n const name = input.name || input.id;\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n errors[name] = this.getErrorMessage(rule, params, input);\r\n this.showError(input, errors[name]);\r\n hasError = true;\r\n break;\r\n } else {\r\n this.clearError(input);\r\n }\r\n }\r\n });\r\n \r\n this.formStates[formId] = {\r\n valid: !hasError,\r\n errors: errors,\r\n errorCount: Object.keys(errors).length\r\n };\r\n \r\n this.updateFormState(form);\r\n \r\n return !hasError;\r\n }\r\n\r\n getValue(input) {\r\n if (input.classList.contains('ds-datepicker__input') || input.classList.contains('ds-timepicker__input')) {\r\n return input.value.trim();\r\n }\r\n \r\n if (input.closest('.ds-select')) {\r\n const select = input.closest('.ds-select');\r\n const valueEl = select.querySelector('.ds-select__value') || select.querySelector('.ds-select__trigger span');\r\n return valueEl ? valueEl.textContent.trim() : '';\r\n }\r\n \r\n if (input.closest('.ds-fileupload')) {\r\n const upload = input.closest('.ds-fileupload');\r\n const uploadInstance = upload.__fileUploadInstance;\r\n return uploadInstance && uploadInstance.getFiles().length > 0 ? 'has-files' : '';\r\n }\r\n \r\n return input.value.trim();\r\n }\r\n\r\n validateInput(input) {\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n }\r\n \r\n this.clearError(input);\r\n return true;\r\n }\r\n\r\n validateAll() {\r\n const forms = document.querySelectorAll('form[data-validation]');\r\n let allValid = true;\r\n \r\n forms.forEach(form => {\r\n if (!this.validate(form)) {\r\n allValid = false;\r\n }\r\n });\r\n \r\n return allValid;\r\n }\r\n\r\n async validateAsync(form, options = {}) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n const errors = {};\r\n const group = options.group;\r\n const inputs = group \r\n ? form.querySelectorAll(`[data-validate][data-validate-group=\"${group}\"]`)\r\n : form.querySelectorAll('[data-validate]');\r\n \r\n let hasError = false;\r\n \r\n for (const input of inputs) {\r\n const isValid = await this.validateInputAsync(input);\r\n if (!isValid) {\r\n hasError = true;\r\n }\r\n }\r\n \r\n const formErrors = {};\r\n inputs.forEach(input => {\r\n const name = input.name || input.id;\r\n const errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n formErrors[name] = errorElement.textContent;\r\n }\r\n });\r\n \r\n this.formStates[formId] = {\r\n valid: !hasError,\r\n errors: formErrors,\r\n errorCount: Object.keys(formErrors).length\r\n };\r\n \r\n this.updateFormState(form);\r\n \r\n return !hasError;\r\n }\r\n\r\n async validateInputAsync(input) {\r\n const rules = this.parseRules(input.getAttribute('data-validate'));\r\n const asyncRules = this.parseRules(input.getAttribute('data-validate-async') || '');\r\n const value = this.getValue(input);\r\n \r\n for (const [rule, params] of Object.entries(rules)) {\r\n const validatorFunc = this.customValidators[rule] || this.validators[rule];\r\n const isValid = validatorFunc?.(value, params);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n }\r\n \r\n for (const [rule, params] of Object.entries(asyncRules)) {\r\n const validatorFunc = this.customAsyncValidators[rule] || this.asyncValidators[rule];\r\n if (validatorFunc) {\r\n try {\r\n const isValid = await validatorFunc(value, params, input);\r\n if (!isValid) {\r\n this.showError(input, this.getErrorMessage(rule, params, input));\r\n return false;\r\n }\r\n } catch (e) {\r\n this.showError(input, e.message || 'Validation error');\r\n return false;\r\n }\r\n }\r\n }\r\n \r\n this.clearError(input);\r\n return true;\r\n }\r\n\r\n async validateGroup(form, groupName) {\r\n const inputs = form.querySelectorAll(`[data-validate][data-validate-group=\"${groupName}\"]`);\r\n let hasError = false;\r\n \r\n for (const input of inputs) {\r\n const isValid = await this.validateInputAsync(input);\r\n if (!isValid) {\r\n hasError = true;\r\n }\r\n }\r\n \r\n return !hasError;\r\n }\r\n\r\n getGroups(form) {\r\n const groups = new Set();\r\n form.querySelectorAll('[data-validate-group]').forEach(input => {\r\n groups.add(input.getAttribute('data-validate-group'));\r\n });\r\n return Array.from(groups);\r\n }\r\n\r\n getFormState(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n return this.formStates[formId] || { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n\r\n updateFormState(form) {\r\n const state = this.getFormState(form);\r\n \r\n if (state.valid) {\r\n form.classList.remove('ds-form--invalid');\r\n form.classList.add('ds-form--valid');\r\n } else {\r\n form.classList.remove('ds-form--valid');\r\n form.classList.add('ds-form--invalid');\r\n }\r\n \r\n if (state.loading) {\r\n form.classList.add('ds-form--loading');\r\n } else {\r\n form.classList.remove('ds-form--loading');\r\n }\r\n \r\n if (state.submitting) {\r\n form.classList.add('ds-form--submitting');\r\n } else {\r\n form.classList.remove('ds-form--submitting');\r\n }\r\n \r\n if (state.disabled) {\r\n form.classList.add('ds-form--disabled');\r\n form.querySelectorAll('input, select, textarea, button').forEach(el => el.disabled = true);\r\n } else {\r\n form.classList.remove('ds-form--disabled');\r\n form.querySelectorAll('input, select, textarea, button').forEach(el => {\r\n if (!el.hasAttribute('data-permanent-disabled')) {\r\n el.disabled = false;\r\n }\r\n });\r\n }\r\n \r\n const statusElement = form.querySelector('.ds-form__status');\r\n if (statusElement) {\r\n if (state.errorCount > 0) {\r\n statusElement.textContent = `${state.errorCount} ${state.errorCount === 1 ? 'error' : 'errors'} found`;\r\n statusElement.classList.add('ds-form__status--error');\r\n } else {\r\n statusElement.textContent = 'All fields are valid';\r\n statusElement.classList.remove('ds-form__status--error');\r\n }\r\n }\r\n }\r\n\r\n setFormLoading(form, loading) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].loading = loading;\r\n this.updateFormState(form);\r\n }\r\n\r\n setFormSubmitting(form, submitting) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].submitting = submitting;\r\n this.updateFormState(form);\r\n }\r\n\r\n setFormDisabled(form, disabled) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n if (!this.formStates[formId]) {\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n }\r\n this.formStates[formId].disabled = disabled;\r\n this.updateFormState(form);\r\n }\r\n\r\n resetForm(form) {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n this.formStates[formId] = { valid: true, errors: {}, errorCount: 0, loading: false, submitting: false, disabled: false };\r\n form.reset();\r\n form.querySelectorAll('.ds-input--error').forEach(el => {\r\n el.classList.remove('ds-input--error');\r\n const errorElement = el.parentElement?.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n errorElement.textContent = '';\r\n }\r\n });\r\n this.updateFormState(form);\r\n }\r\n\r\n parseRules(rulesString) {\r\n const rules = {};\r\n const parts = rulesString.split('|');\r\n \r\n parts.forEach(part => {\r\n const [rule, params] = part.split(':');\r\n rules[rule] = params ? params.split(',') : [];\r\n });\r\n \r\n return rules;\r\n }\r\n\r\n validateRequired(value) {\r\n return value !== '';\r\n }\r\n\r\n validateEmail(value) {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(value);\r\n }\r\n\r\n validateUrl(value) {\r\n const urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/;\r\n return urlRegex.test(value);\r\n }\r\n\r\n validateMinLength(value, [min]) {\r\n return value.length >= parseInt(min);\r\n }\r\n\r\n validateMaxLength(value, [max]) {\r\n return value.length <= parseInt(max);\r\n }\r\n\r\n validatePattern(value, [pattern]) {\r\n const regex = new RegExp(pattern);\r\n return regex.test(value);\r\n }\r\n\r\n validateMin(value, [min]) {\r\n return parseFloat(value) >= parseFloat(min);\r\n }\r\n\r\n validateMax(value, [max]) {\r\n return parseFloat(value) <= parseFloat(max);\r\n }\r\n\r\n validateEqualTo(value, [targetId]) {\r\n const target = document.getElementById(targetId);\r\n return target && value === target.value;\r\n }\r\n\r\n validatePhone(value) {\r\n const phoneRegex = /^[\\d\\s\\-\\+\\(\\)]{7,20}$/;\r\n return phoneRegex.test(value);\r\n }\r\n\r\n validateDate(value) {\r\n const dateRegex = /^\\d{4}[-/]\\d{2}[-/]\\d{2}$/;\r\n return dateRegex.test(value) && !isNaN(Date.parse(value));\r\n }\r\n\r\n validateNumber(value) {\r\n return !isNaN(parseFloat(value)) && isFinite(value);\r\n }\r\n\r\n showError(input, message) {\r\n input.classList.add('ds-input--error');\r\n input.classList.remove('ds-input--success');\r\n input.setAttribute('aria-invalid', 'true');\r\n \r\n let errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (!errorElement) {\r\n errorElement = document.createElement('span');\r\n errorElement.className = 'ds-input__error';\r\n errorElement.setAttribute('role', 'alert');\r\n errorElement.setAttribute('aria-live', 'polite');\r\n input.parentElement.appendChild(errorElement);\r\n }\r\n errorElement.textContent = message;\r\n \r\n this.removeStatusIcon(input);\r\n \r\n input.dispatchEvent(new CustomEvent('validation-error', { detail: { message } }));\r\n }\r\n\r\n clearError(input) {\r\n input.classList.remove('ds-input--error');\r\n input.setAttribute('aria-invalid', 'false');\r\n \r\n const errorElement = input.parentElement.querySelector('.ds-input__error');\r\n if (errorElement) {\r\n errorElement.remove();\r\n }\r\n \r\n input.dispatchEvent(new CustomEvent('validation-success'));\r\n }\r\n\r\n showSuccess(input) {\r\n input.classList.add('ds-input--success');\r\n input.classList.remove('ds-input--error');\r\n input.setAttribute('aria-invalid', 'false');\r\n \r\n this.removeStatusIcon(input);\r\n \r\n const icon = document.createElement('span');\r\n icon.className = 'ds-input__status-icon ds-input__status-icon--success';\r\n icon.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"/></svg>';\r\n \r\n input.parentElement.appendChild(icon);\r\n }\r\n\r\n removeStatusIcon(input) {\r\n const icon = input.parentElement.querySelector('.ds-input__status-icon');\r\n if (icon) {\r\n icon.remove();\r\n }\r\n }\r\n\r\n getErrorMessage(rule, params, input) {\r\n const customMessage = input.getAttribute(`data-message-${rule}`);\r\n if (customMessage) return customMessage;\r\n \r\n const messages = {\r\n required: 'This field is required',\r\n email: 'Please enter a valid email address',\r\n url: 'Please enter a valid URL',\r\n minLength: `Minimum length is ${params[0]} characters`,\r\n maxLength: `Maximum length is ${params[0]} characters`,\r\n pattern: 'Please enter a valid value',\r\n min: `Minimum value is ${params[0]}`,\r\n max: `Maximum value is ${params[0]}`,\r\n equalTo: 'Values do not match',\r\n phone: 'Please enter a valid phone number',\r\n date: 'Please enter a valid date (YYYY-MM-DD)',\r\n number: 'Please enter a valid number'\r\n };\r\n return messages[rule] || 'Invalid input';\r\n }\r\n}\r\n\r\nconst validator = new KupolaValidator();\r\n\r\nif (!window.__kupolaValidationInitialized) {\r\n window.__kupolaValidationInitialized = true;\r\n document.addEventListener('DOMContentLoaded', () => {\r\n document.querySelectorAll('form[data-validation]').forEach(form => {\r\n form.addEventListener('submit', async (e) => {\r\n const formId = form.id || `form-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n if (validator.submitting.has(formId)) {\r\n e.preventDefault();\r\n return;\r\n }\r\n \r\n e.preventDefault();\r\n \r\n const hasAsyncValidation = form.querySelector('[data-validate-async]') !== null;\r\n \r\n let isValid;\r\n if (hasAsyncValidation) {\r\n isValid = await validator.validateAsync(form);\r\n } else {\r\n isValid = validator.validate(form);\r\n }\r\n \r\n if (!isValid) {\r\n const firstError = form.querySelector('.ds-input--error');\r\n if (firstError) {\r\n firstError.focus();\r\n }\r\n } else {\r\n validator.submitting.add(formId);\r\n const submitBtn = form.querySelector('button[type=\"submit\"]');\r\n if (submitBtn) {\r\n const originalText = submitBtn.textContent;\r\n submitBtn.setAttribute('data-original-text', originalText);\r\n submitBtn.textContent = 'Submitting...';\r\n submitBtn.disabled = true;\r\n }\r\n \r\n try {\r\n const onSubmit = form.getAttribute('data-on-submit');\r\n if (onSubmit && window[onSubmit]) {\r\n await window[onSubmit](form);\r\n } else {\r\n form.submit();\r\n }\r\n } finally {\r\n validator.submitting.delete(formId);\r\n if (submitBtn) {\r\n submitBtn.textContent = submitBtn.getAttribute('data-original-text') || 'Submit';\r\n submitBtn.disabled = false;\r\n }\r\n }\r\n }\r\n });\r\n\r\n form.querySelectorAll('[data-validate]').forEach(input => {\r\n input.addEventListener('blur', () => {\r\n setTimeout(() => {\r\n const activeElement = document.activeElement;\r\n if (activeElement && activeElement.closest('.ds-select')) {\r\n return;\r\n }\r\n const isValid = validator.validateInput(input);\r\n if (isValid && input.value.trim()) {\r\n validator.showSuccess(input);\r\n }\r\n }, 50);\r\n });\r\n\r\n const debounce = (func, wait) => {\r\n let timeout;\r\n return (...args) => {\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => func.apply(this, args), wait);\r\n };\r\n };\r\n\r\n const validateOnInput = debounce(() => {\r\n const value = validator.getValue(input);\r\n if (value.length > 0 || input.classList.contains('ds-input--error')) {\r\n const isValid = validator.validateInput(input);\r\n if (isValid && value) {\r\n validator.showSuccess(input);\r\n }\r\n } else {\r\n validator.removeStatusIcon(input);\r\n }\r\n }, 300);\r\n\r\n input.addEventListener('input', validateOnInput);\r\n\r\n input.addEventListener('keyup', (e) => {\r\n if (e.key === 'Enter') {\r\n const isValid = validator.validateInput(input);\r\n if (isValid && input.value.trim()) {\r\n validator.showSuccess(input);\r\n }\r\n }\r\n });\r\n });\r\n });\r\n});\r\n}\r\n\r\nwindow.KupolaValidator = KupolaValidator;\r\nwindow.kupolaValidator = validator;","class VirtualList {\r\n constructor(element, options = {}) {\r\n this.element = element;\r\n this.data = options.data || [];\r\n this.itemHeight = options.itemHeight || 48;\r\n this.itemWidth = options.itemWidth || 200;\r\n this.bufferSize = options.bufferSize || 5;\r\n this.renderItem = options.renderItem || this.defaultRenderItem;\r\n this.onItemClick = options.onItemClick || null;\r\n this.onItemSelect = options.onItemSelect || null;\r\n this.onScroll = options.onScroll || null;\r\n this.onScrollEnd = options.onScrollEnd || null;\r\n this.selectedKey = options.selectedKey || null;\r\n this.keyField = options.keyField || 'id';\r\n this.useDynamicHeight = options.useDynamicHeight || false;\r\n this.dynamicHeightCache = new Map();\r\n this.estimatedHeight = options.estimatedHeight || 48;\r\n \r\n this.container = null;\r\n this.scrollbarTrack = null;\r\n this.scrollbarThumb = null;\r\n this.totalHeight = 0;\r\n this.startIndex = 0;\r\n this.endIndex = 0;\r\n this.isScrolling = false;\r\n this.scrollTimeout = null;\r\n this.lastScrollTop = 0;\r\n this.lastScrollLeft = 0;\r\n \r\n this.init();\r\n }\r\n\r\n defaultRenderItem(item, index) {\r\n return `\r\n <div class=\"ds-virtual-list__item-content\">\r\n <div class=\"ds-virtual-list__item-icon\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\r\n <polyline points=\"14 2 14 8 20 8\"/>\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"/>\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"/>\r\n <polyline points=\"10 9 9 9 8 9\"/>\r\n </svg>\r\n </div>\r\n <div>\r\n <div class=\"ds-virtual-list__item-title\">${item.title || item.name || `Item ${index + 1}`}</div>\r\n <div class=\"ds-virtual-list__item-subtitle\">${item.subtitle || 'Subtitle'}</div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n init() {\r\n this.createStructure();\r\n this.update();\r\n this.bindEvents();\r\n }\r\n\r\n createStructure() {\r\n this.element.innerHTML = `\r\n <div class=\"ds-virtual-list__scrollbar\">\r\n <div class=\"ds-virtual-list__scrollbar-track\">\r\n <div class=\"ds-virtual-list__scrollbar-thumb\"></div>\r\n </div>\r\n </div>\r\n <div class=\"ds-virtual-list__container\"></div>\r\n `;\r\n \r\n this.container = this.element.querySelector('.ds-virtual-list__container');\r\n this.scrollbarThumb = this.element.querySelector('.ds-virtual-list__scrollbar-thumb');\r\n }\r\n\r\n bindEvents() {\r\n this._scrollHandler = (e) => this.handleScroll(e);\r\n this._thumbDragStartHandler = (e) => this.handleThumbDragStart(e);\r\n this._thumbDragMoveHandler = (e) => this.handleThumbDragMove(e);\r\n this._thumbDragEndHandler = () => this.handleThumbDragEnd();\r\n this._wheelHandler = (e) => {\r\n e.preventDefault();\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n if (isHorizontal) {\r\n this.element.scrollLeft += e.deltaX + e.deltaY;\r\n } else {\r\n this.element.scrollTop += e.deltaY + e.deltaX;\r\n }\r\n };\r\n \r\n this.element.addEventListener('scroll', this._scrollHandler);\r\n this.scrollbarThumb.addEventListener('mousedown', this._thumbDragStartHandler);\r\n \r\n document.addEventListener('mousemove', this._thumbDragMoveHandler);\r\n document.addEventListener('mouseup', this._thumbDragEndHandler);\r\n \r\n this.element.addEventListener('wheel', this._wheelHandler, { passive: false });\r\n \r\n this._listeners = [\r\n { el: this.element, event: 'scroll', handler: this._scrollHandler },\r\n { el: this.scrollbarThumb, event: 'mousedown', handler: this._thumbDragStartHandler },\r\n { el: document, event: 'mousemove', handler: this._thumbDragMoveHandler },\r\n { el: document, event: 'mouseup', handler: this._thumbDragEndHandler },\r\n { el: this.element, event: 'wheel', handler: this._wheelHandler }\r\n ];\r\n }\r\n\r\n handleScroll(e) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n \r\n if (this.onScroll) {\r\n this.onScroll({ \r\n scrollOffset, \r\n isHorizontal,\r\n dataLength: this.data.length,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n \r\n this.updateScrollState();\r\n this.renderVisibleItems();\r\n this.updateScrollbar();\r\n }\r\n\r\n updateScrollState() {\r\n this.isScrolling = true;\r\n this.element.classList.add('ds-virtual-list--scrolling');\r\n \r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n }\r\n \r\n this.scrollTimeout = setTimeout(() => {\r\n this.isScrolling = false;\r\n this.element.classList.remove('ds-virtual-list--scrolling');\r\n \r\n if (this.onScrollEnd) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n this.onScrollEnd({ \r\n scrollOffset, \r\n isHorizontal,\r\n dataLength: this.data.length,\r\n startIndex: this.startIndex,\r\n endIndex: this.endIndex\r\n });\r\n }\r\n }, 200);\r\n }\r\n\r\n getItemSize(index) {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n if (this.useDynamicHeight) {\r\n const key = this.data[index][this.keyField] || index;\r\n if (this.dynamicHeightCache.has(key)) {\r\n return this.dynamicHeightCache.get(key);\r\n }\r\n }\r\n \r\n return isHorizontal ? this.itemWidth : this.itemHeight;\r\n }\r\n\r\n getItemPositions() {\r\n const positions = [];\r\n let currentPosition = 0;\r\n \r\n this.data.forEach((item, index) => {\r\n const size = this.getItemSize(index);\r\n positions.push({\r\n start: currentPosition,\r\n end: currentPosition + size,\r\n size\r\n });\r\n currentPosition += size;\r\n });\r\n \r\n return positions;\r\n }\r\n\r\n getTotalSize() {\r\n if (this.useDynamicHeight) {\r\n return this.data.reduce((total, item, index) => {\r\n return total + this.getItemSize(index);\r\n }, 0);\r\n }\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n return this.data.length * itemSize;\r\n }\r\n\r\n getIndexAtOffset(offset) {\r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n for (let i = 0; i < positions.length; i++) {\r\n if (offset >= positions[i].start && offset < positions[i].end) {\r\n return i;\r\n }\r\n }\r\n return this.data.length - 1;\r\n }\r\n \r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n return Math.floor(offset / itemSize);\r\n }\r\n\r\n renderVisibleItems() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n \r\n const startIndex = Math.max(0, this.getIndexAtOffset(scrollOffset) - this.bufferSize);\r\n let endIndex = Math.min(\r\n this.data.length - 1,\r\n this.getIndexAtOffset(scrollOffset + viewportSize) + this.bufferSize\r\n );\r\n \r\n if (endIndex < startIndex) endIndex = startIndex;\r\n \r\n this.startIndex = startIndex;\r\n this.endIndex = endIndex;\r\n \r\n const visibleData = this.data.slice(startIndex, endIndex + 1);\r\n \r\n let html = '';\r\n let currentPosition = 0;\r\n \r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n currentPosition = positions[startIndex]?.start || 0;\r\n } else {\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n currentPosition = startIndex * itemSize;\r\n }\r\n \r\n visibleData.forEach((item, i) => {\r\n const actualIndex = startIndex + i;\r\n const key = item[this.keyField] || actualIndex;\r\n const isSelected = this.selectedKey === key;\r\n const itemSize = this.getItemSize(actualIndex);\r\n const position = currentPosition;\r\n \r\n if (isHorizontal) {\r\n html += `\r\n <div \r\n class=\"ds-virtual-list__item${isSelected ? ' is-selected' : ''}\" \r\n style=\"position: absolute; top: 0; left: ${position}px; width: ${itemSize}px; height: 100%;\"\r\n data-index=\"${actualIndex}\"\r\n data-key=\"${key}\"\r\n >\r\n ${this.renderItem(item, actualIndex)}\r\n </div>\r\n `;\r\n } else {\r\n html += `\r\n <div \r\n class=\"ds-virtual-list__item${isSelected ? ' is-selected' : ''}\" \r\n style=\"position: absolute; top: ${position}px; left: 0; right: 0; height: ${itemSize}px;\"\r\n data-index=\"${actualIndex}\"\r\n data-key=\"${key}\"\r\n >\r\n ${this.renderItem(item, actualIndex)}\r\n </div>\r\n `;\r\n }\r\n \r\n currentPosition += itemSize;\r\n });\r\n \r\n this.container.innerHTML = html;\r\n \r\n if (this.useDynamicHeight) {\r\n this.updateDynamicHeights();\r\n }\r\n \r\n this.container.querySelectorAll('.ds-virtual-list__item').forEach(item => {\r\n item.addEventListener('click', () => this.handleItemClick(item));\r\n });\r\n }\r\n\r\n updateDynamicHeights() {\r\n if (this.isUpdating) return;\r\n \r\n let hasChanges = false;\r\n this.container.querySelectorAll('.ds-virtual-list__item').forEach(item => {\r\n const index = parseInt(item.dataset.index);\r\n const key = this.data[index][this.keyField] || index;\r\n const actualHeight = item.offsetHeight;\r\n \r\n if (actualHeight !== this.getItemSize(index)) {\r\n this.dynamicHeightCache.set(key, actualHeight);\r\n hasChanges = true;\r\n }\r\n });\r\n \r\n if (hasChanges) {\r\n this.isUpdating = true;\r\n this.update();\r\n this.isUpdating = false;\r\n }\r\n }\r\n\r\n handleItemClick(item) {\r\n const index = parseInt(item.dataset.index);\r\n const key = item.dataset.key;\r\n const dataItem = this.data[index];\r\n \r\n if (this.onItemClick) {\r\n this.onItemClick({ item: dataItem, index, key });\r\n }\r\n \r\n if (this.onItemSelect) {\r\n this.select(key);\r\n }\r\n }\r\n\r\n select(key) {\r\n this.selectedKey = key;\r\n \r\n if (this.onItemSelect) {\r\n const index = this.data.findIndex(item => item[this.keyField] === key);\r\n if (index !== -1) {\r\n this.onItemSelect({ item: this.data[index], index, key });\r\n }\r\n }\r\n \r\n this.renderVisibleItems();\r\n }\r\n\r\n updateScrollbar() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n const scrollOffset = isHorizontal ? this.element.scrollLeft : this.element.scrollTop;\r\n \r\n if (isHorizontal) {\r\n this.scrollbarThumb.style.display = 'none';\r\n return;\r\n }\r\n \r\n const thumbHeight = Math.max(20, (viewportSize / totalSize) * viewportSize);\r\n const maxTop = viewportSize - thumbHeight;\r\n const thumbTop = (scrollOffset / (totalSize - viewportSize || 1)) * maxTop;\r\n \r\n this.scrollbarThumb.style.height = thumbHeight + 'px';\r\n this.scrollbarThumb.style.top = thumbTop + 'px';\r\n }\r\n\r\n handleThumbDragStart(e) {\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.dragStartY = e.clientY;\r\n this.dragStartTop = parseFloat(this.scrollbarThumb.style.top) || 0;\r\n }\r\n\r\n handleThumbDragMove(e) {\r\n if (!this.isDragging) return;\r\n \r\n const viewportHeight = this.element.clientHeight;\r\n const totalHeight = this.getTotalSize();\r\n const thumbHeight = parseFloat(this.scrollbarThumb.style.height) || viewportHeight;\r\n const maxTop = viewportHeight - thumbHeight;\r\n \r\n const deltaY = e.clientY - this.dragStartY;\r\n let newTop = this.dragStartTop + deltaY;\r\n newTop = Math.max(0, Math.min(newTop, maxTop));\r\n \r\n this.scrollbarThumb.style.top = newTop + 'px';\r\n \r\n const scrollTop = (newTop / maxTop) * (totalHeight - viewportHeight || 0);\r\n this.element.scrollTop = scrollTop;\r\n }\r\n\r\n handleThumbDragEnd() {\r\n this.isDragging = false;\r\n }\r\n\r\n update() {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n \r\n if (isHorizontal) {\r\n this.container.style.width = totalSize + 'px';\r\n this.container.style.height = '100%';\r\n } else {\r\n this.container.style.height = totalSize + 'px';\r\n this.container.style.width = '100%';\r\n }\r\n \r\n this.renderVisibleItems();\r\n this.updateScrollbar();\r\n }\r\n\r\n setData(data) {\r\n this.data = data;\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n addItem(item) {\r\n this.data.push(item);\r\n this.update();\r\n }\r\n\r\n removeItem(index) {\r\n this.data.splice(index, 1);\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n insertItem(index, item) {\r\n this.data.splice(index, 0, item);\r\n if (this.useDynamicHeight) {\r\n this.dynamicHeightCache.clear();\r\n }\r\n this.update();\r\n }\r\n\r\n scrollTo(index, behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n \r\n let scrollOffset = 0;\r\n if (this.useDynamicHeight) {\r\n const positions = this.getItemPositions();\r\n scrollOffset = positions[index]?.start || 0;\r\n } else {\r\n const itemSize = isHorizontal ? this.itemWidth : this.itemHeight;\r\n scrollOffset = index * itemSize;\r\n }\r\n \r\n if (isHorizontal) {\r\n this.element.scrollTo({ left: scrollOffset, behavior });\r\n } else {\r\n this.element.scrollTo({ top: scrollOffset, behavior });\r\n }\r\n }\r\n\r\n scrollToKey(key, behavior = 'smooth') {\r\n const index = this.data.findIndex(item => item[this.keyField] === key);\r\n if (index !== -1) {\r\n this.scrollTo(index, behavior);\r\n }\r\n }\r\n\r\n scrollToTop(behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n this.element.scrollTo({ [isHorizontal ? 'left' : 'top']: 0, behavior });\r\n }\r\n\r\n scrollToBottom(behavior = 'smooth') {\r\n const isHorizontal = this.element.classList.contains('ds-virtual-list--horizontal');\r\n const totalSize = this.getTotalSize();\r\n const viewportSize = isHorizontal ? this.element.clientWidth : this.element.clientHeight;\r\n this.element.scrollTo({ [isHorizontal ? 'left' : 'top']: totalSize - viewportSize, behavior });\r\n }\r\n\r\n getVisibleItems() {\r\n return this.data.slice(this.startIndex, this.endIndex + 1).map((item, i) => ({\r\n item,\r\n index: this.startIndex + i,\r\n key: item[this.keyField] || this.startIndex + i\r\n }));\r\n }\r\n\r\n getItemIndex(key) {\r\n return this.data.findIndex(item => item[this.keyField] === key);\r\n }\r\n\r\n getItem(key) {\r\n const index = this.getItemIndex(key);\r\n return index !== -1 ? this.data[index] : null;\r\n }\r\n\r\n refreshCache() {\r\n this.dynamicHeightCache.clear();\r\n this.update();\r\n }\r\n\r\n destroy() {\r\n if (this.scrollTimeout) {\r\n clearTimeout(this.scrollTimeout);\r\n }\r\n \r\n this._listeners?.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n \r\n this.data = [];\r\n this.dynamicHeightCache.clear();\r\n this.container.innerHTML = '';\r\n \r\n this._listeners = null;\r\n this._scrollHandler = null;\r\n this._thumbDragStartHandler = null;\r\n this._thumbDragMoveHandler = null;\r\n this._thumbDragEndHandler = null;\r\n this._wheelHandler = null;\r\n this.container = null;\r\n this.scrollbarThumb = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction generateMockVirtualListData(count = 1000) {\r\n const data = [];\r\n const titles = ['Document', 'Image', 'Video', 'Folder', 'Archive', 'Spreadsheet', 'Presentation', 'Code'];\r\n \r\n for (let i = 1; i <= count; i++) {\r\n const titleIndex = Math.floor(Math.random() * titles.length);\r\n const randomNum = Math.floor(Math.random() * 10000);\r\n \r\n data.push({\r\n id: i,\r\n title: `${titles[titleIndex]} ${randomNum}`,\r\n subtitle: `Last modified ${Math.floor(Math.random() * 30)} days ago`,\r\n type: titles[titleIndex].toLowerCase()\r\n });\r\n }\r\n \r\n return data;\r\n}\r\n\r\nfunction createVirtualList(selector, options = {}) {\r\n const element = document.querySelector(selector);\r\n if (element) {\r\n const data = options.data || generateMockVirtualListData(options.count || 1000);\r\n return new VirtualList(element, {\r\n data: data,\r\n ...options\r\n });\r\n }\r\n return null;\r\n}\r\n\r\nfunction initVirtualList(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const dataAttr = element.getAttribute('data-virtual-list');\r\n let data = [];\r\n \r\n if (dataAttr) {\r\n try {\r\n data = JSON.parse(dataAttr);\r\n } catch (e) {\r\n data = generateMockVirtualListData(1000);\r\n }\r\n } else {\r\n data = generateMockVirtualListData(1000);\r\n }\r\n \r\n const instance = new VirtualList(element, {\r\n data: data,\r\n onItemClick: (info) => {},\r\n onItemSelect: (info) => {}\r\n });\r\n \r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupVirtualList(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initVirtualLists() {\r\n document.querySelectorAll('.ds-virtual-list').forEach(element => {\r\n initVirtualList(element);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { VirtualList, initVirtualLists, initVirtualList, cleanupVirtualList, createVirtualList, generateMockVirtualListData };\r\n} else {\r\n window.initVirtualList = initVirtualList;\r\n window.cleanupVirtualList = cleanupVirtualList;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('virtual-list', initVirtualList, cleanupVirtualList);\r\n}","class KupolaDevTools {\r\n constructor(options = {}) {\r\n this.enabled = options.enabled ?? false;\r\n this.panel = null;\r\n this.isOpen = false;\r\n this.activeTab = 'storage';\r\n this.activeStorageType = 'cookies';\r\n this.requestHistory = [];\r\n this.maxHistorySize = 50;\r\n }\r\n\r\n init() {\r\n if (!this.enabled) return;\r\n try {\r\n this.createToggleButton();\r\n this.createPanel();\r\n this.setupNetworkInterceptor();\r\n } catch (error) {\r\n console.error('Error in init:', error);\r\n }\r\n }\r\n\r\n createToggleButton() {\r\n const button = document.createElement('button');\r\n button.className = 'kupola-devtools__toggle';\r\n button.textContent = '🛠️';\r\n button.style.cssText = `\r\n position: fixed;\r\n bottom: 28px;\r\n left: 50px;\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n background: #535164;\r\n color: white;\r\n border: none;\r\n cursor: pointer;\r\n z-index: 9999;\r\n font-size: 20px;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n transition: transform 0.2s;\r\n `;\r\n button.addEventListener('click', () => this.togglePanel());\r\n document.body.appendChild(button);\r\n this.toggleButton = button;\r\n }\r\n\r\n createPanel() {\r\n const panel = document.createElement('div');\r\n panel.className = 'kupola-devtools__panel';\r\n panel.style.cssText = `\r\n position: fixed;\r\n bottom: 80px;\r\n left: 28px;\r\n width: 550px;\r\n max-height: 650px;\r\n background: #1e1e1e;\r\n border-radius: 12px;\r\n box-shadow: 0 8px 32px rgba(0,0,0,0.4);\r\n z-index: 9998;\r\n display: none;\r\n flex-direction: column;\r\n overflow: hidden;\r\n border: 1px solid #333;\r\n `;\r\n \r\n panel.innerHTML = `\r\n <div class=\"kupola-devtools__header\">\r\n <span class=\"kupola-devtools__title\">DevTools</span>\r\n <button class=\"kupola-devtools__close\">✕</button>\r\n </div>\r\n <div class=\"kupola-devtools__tabs\">\r\n <button data-tab=\"storage\" class=\"kupola-devtools__tab active\">Storage</button>\r\n <button data-tab=\"network\" class=\"kupola-devtools__tab\">Network</button>\r\n </div>\r\n <div class=\"kupola-devtools__sub-tabs\" id=\"storage-sub-tabs\">\r\n <button class=\"kupola-devtools__sub-tab active\" data-storage=\"cookies\">Cookies</button>\r\n <button class=\"kupola-devtools__sub-tab\" data-storage=\"localStorage\">LocalStorage</button>\r\n <button class=\"kupola-devtools__sub-tab\" data-storage=\"sessionStorage\">SessionStorage</button>\r\n </div>\r\n <div class=\"kupola-devtools__sub-tabs\" id=\"network-sub-tabs\" style=\"display:none;\">\r\n <button class=\"kupola-devtools__network-action\" data-action=\"clear\">Clear</button>\r\n </div>\r\n <div class=\"kupola-devtools__content\">\r\n ${this.getStorageContent('cookies')}\r\n </div>\r\n `;\r\n \r\n document.body.appendChild(panel);\r\n this.panel = panel;\r\n \r\n panel.querySelector('.kupola-devtools__close').addEventListener('click', () => this.togglePanel());\r\n panel.querySelectorAll('.kupola-devtools__tab').forEach(tab => {\r\n tab.addEventListener('click', () => this.switchTab(tab.dataset.tab));\r\n });\r\n this.setupStorageListener();\r\n this.makeDraggable();\r\n this.injectStyles();\r\n }\r\n\r\n switchTab(tabName) {\r\n this.activeTab = tabName;\r\n \r\n this.panel.querySelectorAll('.kupola-devtools__tab').forEach(tab => {\r\n tab.classList.toggle('active', tab.dataset.tab === tabName);\r\n });\r\n \r\n const storageSubTabs = this.panel.querySelector('#storage-sub-tabs');\r\n const networkSubTabs = this.panel.querySelector('#network-sub-tabs');\r\n \r\n if (tabName === 'storage') {\r\n storageSubTabs.style.display = 'flex';\r\n networkSubTabs.style.display = 'none';\r\n this.renderStorageContent();\r\n } else {\r\n storageSubTabs.style.display = 'none';\r\n networkSubTabs.style.display = 'flex';\r\n this.renderNetworkContent();\r\n }\r\n }\r\n\r\n renderStorageContent() {\r\n const content = this.panel.querySelector('.kupola-devtools__content');\r\n if (content) {\r\n content.innerHTML = this.getStorageContent(this.activeStorageType);\r\n }\r\n }\r\n\r\n renderNetworkContent() {\r\n const content = this.panel.querySelector('.kupola-devtools__content');\r\n if (!content) return;\r\n \r\n if (this.requestHistory.length === 0) {\r\n content.innerHTML = '<div class=\"kupola-devtools__loading\">No network requests captured</div>';\r\n return;\r\n }\r\n \r\n let html = '';\r\n this.requestHistory.forEach((req, index) => {\r\n const statusClass = req.status >= 200 && req.status < 300 ? 'success' : \r\n req.status >= 400 ? 'error' : 'warning';\r\n const duration = req.duration ? `${req.duration}ms` : '-';\r\n \r\n html += `\r\n <div class=\"kupola-devtools__network-item\" data-index=\"${index}\">\r\n <div class=\"kupola-devtools__network-header\">\r\n <span class=\"kupola-devtools__network-method\">${req.method}</span>\r\n <span class=\"kupola-devtools__network-url\">${req.url}</span>\r\n <span class=\"kupola-devtools__network-status ${statusClass}\">${req.status}</span>\r\n <span class=\"kupola-devtools__network-duration\">${duration}</span>\r\n </div>\r\n <div class=\"kupola-devtools__network-details\" style=\"display:none;\">\r\n ${req.params ? `<div class=\"kupola-devtools__network-detail\"><strong>Params:</strong><pre>${this.truncateContent(JSON.stringify(req.params, null, 2), 1000)}</pre></div>` : ''}\r\n ${req.requestBody ? `<div class=\"kupola-devtools__network-detail\"><strong>Request Body:</strong><pre>${this.truncateContent(req.requestBody, 1000)}</pre></div>` : ''}\r\n ${req.response ? `<div class=\"kupola-devtools__network-detail\"><strong>Response:</strong><pre>${this.truncateContent(req.response, 1500)}</pre></div>` : ''}\r\n </div>\r\n </div>\r\n `;\r\n });\r\n \r\n content.innerHTML = html;\r\n \r\n content.querySelectorAll('.kupola-devtools__network-item').forEach(item => {\r\n item.addEventListener('click', () => {\r\n const details = item.querySelector('.kupola-devtools__network-details');\r\n details.style.display = details.style.display === 'none' ? 'block' : 'none';\r\n });\r\n });\r\n \r\n const clearBtn = this.panel.querySelector('[data-action=\"clear\"]');\r\n if (clearBtn) {\r\n clearBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.clearNetworkHistory();\r\n });\r\n }\r\n }\r\n\r\n clearNetworkHistory() {\r\n this.requestHistory = [];\r\n this.renderNetworkContent();\r\n }\r\n\r\n truncateContent(content, maxLength) {\r\n if (!content) return '-';\r\n const str = typeof content === 'string' ? content : JSON.stringify(content);\r\n if (str.length <= maxLength) return str;\r\n return str.substring(0, maxLength) + `... (truncated, ${str.length} chars)`;\r\n }\r\n\r\n setupNetworkInterceptor() {\r\n const devTools = this;\r\n \r\n const originalFetch = window.fetch;\r\n window.fetch = async function(url, options = {}) {\r\n const startTime = Date.now();\r\n const requestId = Date.now() + Math.random();\r\n \r\n let requestBody = null;\r\n if (options.body) {\r\n if (typeof options.body === 'string') {\r\n requestBody = options.body;\r\n } else if (options.body instanceof FormData) {\r\n try {\r\n requestBody = JSON.stringify(Object.fromEntries(options.body));\r\n } catch {}\r\n } else {\r\n try {\r\n requestBody = JSON.stringify(options.body);\r\n } catch {}\r\n }\r\n }\r\n \r\n let params = null;\r\n try {\r\n const urlObj = new URL(typeof url === 'string' ? url : url.href);\r\n if (urlObj.search) {\r\n params = Object.fromEntries(urlObj.searchParams);\r\n }\r\n } catch {}\r\n \r\n const entry = {\r\n id: requestId,\r\n method: options.method || 'GET',\r\n url: typeof url === 'string' ? url : url.href,\r\n params,\r\n requestBody,\r\n status: 0,\r\n response: null,\r\n duration: null\r\n };\r\n \r\n devTools.addRequest(entry);\r\n \r\n try {\r\n const response = await originalFetch.apply(this, arguments);\r\n \r\n entry.status = response.status;\r\n entry.duration = Date.now() - startTime;\r\n \r\n try {\r\n const clone = response.clone();\r\n const text = await clone.text();\r\n try {\r\n entry.response = JSON.parse(text);\r\n } catch {\r\n entry.response = text;\r\n }\r\n } catch {}\r\n \r\n devTools.updateRequest(entry);\r\n \r\n return response;\r\n } catch (error) {\r\n entry.status = -1;\r\n entry.response = error.message;\r\n entry.duration = Date.now() - startTime;\r\n devTools.updateRequest(entry);\r\n throw error;\r\n }\r\n };\r\n \r\n const originalOpen = XMLHttpRequest.prototype.open;\r\n XMLHttpRequest.prototype.open = function(method, url) {\r\n this.__kupolaRequest = {\r\n method,\r\n url,\r\n params: null,\r\n requestBody: null,\r\n status: 0,\r\n response: null,\r\n startTime: Date.now()\r\n };\r\n \r\n try {\r\n const urlObj = new URL(url);\r\n if (urlObj.search) {\r\n this.__kupolaRequest.params = Object.fromEntries(urlObj.searchParams);\r\n }\r\n } catch {}\r\n \r\n originalOpen.apply(this, arguments);\r\n };\r\n \r\n const originalSend = XMLHttpRequest.prototype.send;\r\n XMLHttpRequest.prototype.send = function(body) {\r\n if (this.__kupolaRequest) {\r\n if (body) {\r\n if (typeof body === 'string') {\r\n this.__kupolaRequest.requestBody = body;\r\n } else if (body instanceof FormData) {\r\n try {\r\n this.__kupolaRequest.requestBody = JSON.stringify(Object.fromEntries(body));\r\n } catch {}\r\n }\r\n }\r\n \r\n const entry = { ...this.__kupolaRequest };\r\n devTools.addRequest(entry);\r\n this.__kupolaEntry = entry;\r\n }\r\n \r\n originalSend.apply(this, arguments);\r\n };\r\n \r\n const originalOnReadyStateChange = XMLHttpRequest.prototype.onreadystatechange;\r\n XMLHttpRequest.prototype.onreadystatechange = function() {\r\n if (this.__kupolaEntry && this.readyState === 4) {\r\n this.__kupolaEntry.status = this.status;\r\n this.__kupolaEntry.duration = Date.now() - this.__kupolaRequest.startTime;\r\n \r\n try {\r\n const responseText = this.responseText;\r\n try {\r\n this.__kupolaEntry.response = JSON.parse(responseText);\r\n } catch {\r\n this.__kupolaEntry.response = responseText;\r\n }\r\n } catch {}\r\n \r\n devTools.updateRequest(this.__kupolaEntry);\r\n }\r\n \r\n if (typeof originalOnReadyStateChange === 'function') {\r\n originalOnReadyStateChange.apply(this, arguments);\r\n }\r\n };\r\n }\r\n\r\n addRequest(entry) {\r\n this.requestHistory.unshift(entry);\r\n if (this.requestHistory.length > this.maxHistorySize) {\r\n this.requestHistory.pop();\r\n }\r\n \r\n if (this.isOpen && this.activeTab === 'network') {\r\n this.renderNetworkContent();\r\n }\r\n }\r\n\r\n updateRequest(entry) {\r\n const index = this.requestHistory.findIndex(r => r.id === entry.id || \r\n (r.url === entry.url && r.method === entry.method && !r.status));\r\n if (index !== -1) {\r\n this.requestHistory[index] = entry;\r\n \r\n if (this.isOpen && this.activeTab === 'network') {\r\n this.renderNetworkContent();\r\n }\r\n }\r\n }\r\n \r\n setupStorageListener() {\r\n const devTools = this;\r\n \r\n window.addEventListener('storage', (e) => {\r\n if (devTools.isOpen && devTools.activeTab === 'storage') {\r\n const content = devTools.panel?.querySelector('.kupola-devtools__content');\r\n if (content) {\r\n const type = e.storageArea === localStorage ? 'localStorage' : 'sessionStorage';\r\n devTools.activeStorageType = type;\r\n devTools.updateStorageTabs();\r\n content.innerHTML = devTools.getStorageContent(type);\r\n }\r\n }\r\n });\r\n \r\n const originalSetItem = Storage.prototype.setItem;\r\n Storage.prototype.setItem = function(key, value) {\r\n const oldValue = this.getItem(key);\r\n originalSetItem.call(this, key, value);\r\n const event = new StorageEvent('storage', {\r\n key,\r\n oldValue,\r\n newValue: value,\r\n url: window.location.href,\r\n storageArea: this\r\n });\r\n window.dispatchEvent(event);\r\n };\r\n \r\n const originalRemoveItem = Storage.prototype.removeItem;\r\n Storage.prototype.removeItem = function(key) {\r\n const oldValue = this.getItem(key);\r\n originalRemoveItem.call(this, key);\r\n const event = new StorageEvent('storage', {\r\n key,\r\n oldValue,\r\n newValue: null,\r\n url: window.location.href,\r\n storageArea: this\r\n });\r\n window.dispatchEvent(event);\r\n };\r\n }\r\n\r\n injectStyles() {\r\n const styles = document.createElement('style');\r\n styles.textContent = `\r\n .kupola-devtools__header { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; background: #2d2d2d; border-bottom: 1px solid #333; }\r\n .kupola-devtools__title { color: #535164; font-weight: 600; font-size: 14px; }\r\n .kupola-devtools__close { background: none; border: none; color: #888; cursor: pointer; font-size: 14px; padding: 4px; }\r\n .kupola-devtools__close:hover { color: #fff; }\r\n .kupola-devtools__tabs { display: flex; background: #252525; border-bottom: 1px solid #333; }\r\n .kupola-devtools__tab { flex: 1; padding: 10px 8px; background: none; border: none; color: #888; cursor: pointer; font-size: 11px; border-bottom: 2px solid transparent; transition: all 0.2s; }\r\n .kupola-devtools__tab:hover { color: #fff; }\r\n .kupola-devtools__tab.active { color: #535164; border-bottom-color: #535164; }\r\n .kupola-devtools__sub-tabs { display: flex; gap: 4px; padding: 8px 12px; background: #1e1e1e; border-bottom: 1px solid #333; }\r\n .kupola-devtools__sub-tab { padding: 4px 8px; background: #333; border: none; color: #888; cursor: pointer; font-size: 11px; border-radius: 4px; }\r\n .kupola-devtools__sub-tab:hover { color: #fff; }\r\n .kupola-devtools__sub-tab.active { background: #535164; color: white; }\r\n .kupola-devtools__network-action { padding: 4px 8px; background: #333; border: none; color: #888; cursor: pointer; font-size: 11px; border-radius: 4px; }\r\n .kupola-devtools__network-action:hover { color: #fff; background: #444; }\r\n .kupola-devtools__content { flex: 1; overflow-y: auto; padding: 12px; font-family: 'Consolas', monospace; font-size: 12px; }\r\n .kupola-devtools__list-item { padding: 6px 8px; border-radius: 4px; margin-bottom: 4px; background: #2a2a2a; }\r\n .kupola-devtools__list-item:hover { background: #333; }\r\n .kupola-devtools__loading { display: flex; justify-content: center; align-items: center; height: 100px; color: #666; }\r\n .kupola-devtools__storage-key { color: #9cdcfe; margin-right: 8px; }\r\n .kupola-devtools__storage-value { color: #ce9178; word-break: break-all; }\r\n .kupola-devtools__network-item { padding: 6px 8px; border-radius: 4px; margin-bottom: 4px; background: #2a2a2a; cursor: pointer; }\r\n .kupola-devtools__network-item:hover { background: #333; }\r\n .kupola-devtools__network-header { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\r\n .kupola-devtools__network-method { padding: 2px 6px; border-radius: 3px; font-weight: 600; font-size: 11px; color: white; }\r\n .kupola-devtools__network-method.GET { background: #4CAF50; }\r\n .kupola-devtools__network-method.POST { background: #2196F3; }\r\n .kupola-devtools__network-method.PUT { background: #FF9800; }\r\n .kupola-devtools__network-method.DELETE { background: #F44336; }\r\n .kupola-devtools__network-method.PATCH { background: #9C27B0; }\r\n .kupola-devtools__network-url { flex: 1; color: #9cdcfe; font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .kupola-devtools__network-status { padding: 2px 6px; border-radius: 3px; font-size: 11px; font-weight: 600; }\r\n .kupola-devtools__network-status.success { background: #4CAF50; color: white; }\r\n .kupola-devtools__network-status.error { background: #F44336; color: white; }\r\n .kupola-devtools__network-status.warning { background: #FF9800; color: white; }\r\n .kupola-devtools__network-duration { color: #888; font-size: 11px; }\r\n .kupola-devtools__network-details { margin-top: 8px; padding-top: 8px; border-top: 1px solid #333; }\r\n .kupola-devtools__network-detail { margin-bottom: 8px; }\r\n .kupola-devtools__network-detail strong { color: #535164; display: block; margin-bottom: 4px; }\r\n .kupola-devtools__network-detail pre { margin: 0; color: #ce9178; white-space: pre-wrap; word-break: break-all; }\r\n `;\r\n document.head.appendChild(styles);\r\n }\r\n\r\n makeDraggable() {\r\n const header = this.panel.querySelector('.kupola-devtools__header');\r\n let isDragging = false;\r\n let startX, startY, startLeft, startTop;\r\n\r\n this._dragMouseDownHandler = (e) => {\r\n if (e.target.closest('.kupola-devtools__close')) return;\r\n isDragging = true;\r\n startX = e.clientX;\r\n startY = e.clientY;\r\n startLeft = this.panel.offsetLeft;\r\n startTop = this.panel.offsetTop;\r\n };\r\n\r\n this._dragMouseMoveHandler = (e) => {\r\n if (!isDragging) return;\r\n const dx = e.clientX - startX;\r\n const dy = e.clientY - startY;\r\n this.panel.style.left = `${startLeft + dx}px`;\r\n this.panel.style.right = 'auto';\r\n this.panel.style.top = `${Math.max(0, startTop + dy)}px`;\r\n };\r\n\r\n this._dragMouseUpHandler = () => { isDragging = false; };\r\n\r\n header.addEventListener('mousedown', this._dragMouseDownHandler);\r\n document.addEventListener('mousemove', this._dragMouseMoveHandler);\r\n document.addEventListener('mouseup', this._dragMouseUpHandler);\r\n }\r\n\r\n destroy() {\r\n const header = this.panel.querySelector('.kupola-devtools__header');\r\n \r\n if (header && this._dragMouseDownHandler) {\r\n header.removeEventListener('mousedown', this._dragMouseDownHandler);\r\n }\r\n \r\n if (this._dragMouseMoveHandler) {\r\n document.removeEventListener('mousemove', this._dragMouseMoveHandler);\r\n }\r\n \r\n if (this._dragMouseUpHandler) {\r\n document.removeEventListener('mouseup', this._dragMouseUpHandler);\r\n }\r\n \r\n if (this.panel && this.panel.parentNode) {\r\n this.panel.parentNode.removeChild(this.panel);\r\n }\r\n \r\n this._dragMouseDownHandler = null;\r\n this._dragMouseMoveHandler = null;\r\n this._dragMouseUpHandler = null;\r\n this.panel = null;\r\n }\r\n\r\n togglePanel() {\r\n this.isOpen = !this.isOpen;\r\n this.panel.style.display = this.isOpen ? 'flex' : 'none';\r\n \r\n if (this.isOpen && this.activeTab === 'network') {\r\n this.renderNetworkContent();\r\n }\r\n }\r\n\r\n updateStorageTabs() {\r\n this.panel.querySelectorAll('.kupola-devtools__sub-tab').forEach(tab => {\r\n tab.classList.toggle('active', tab.dataset.storage === this.activeStorageType);\r\n });\r\n }\r\n\r\n getStorageContent(type) {\r\n let items = [];\r\n \r\n try {\r\n if (type === 'cookies') {\r\n items = document.cookie.split(';').map(c => c.trim()).filter(c => c).map(c => {\r\n const [key, ...valueParts] = c.split('=');\r\n return { key, value: valueParts.join('=') };\r\n });\r\n } else if (type === 'localStorage') {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n items.push({ key: localStorage.key(i), value: localStorage.getItem(localStorage.key(i)) });\r\n }\r\n } else if (type === 'sessionStorage') {\r\n for (let i = 0; i < sessionStorage.length; i++) {\r\n items.push({ key: sessionStorage.key(i), value: sessionStorage.getItem(sessionStorage.key(i)) });\r\n }\r\n }\r\n } catch (e) {\r\n console.error('Error reading storage:', e);\r\n return '<div class=\"kupola-devtools__loading\">Error reading storage</div>';\r\n }\r\n \r\n if (items.length === 0) return '<div class=\"kupola-devtools__loading\">No data</div>';\r\n \r\n let html = '';\r\n items.forEach(item => {\r\n let displayValue = item.value;\r\n if (displayValue && displayValue.length > 0 && displayValue.length < 2000) {\r\n try { \r\n const parsed = JSON.parse(displayValue);\r\n displayValue = JSON.stringify(parsed, null, 2); \r\n } catch {}\r\n } else if (displayValue && displayValue.length >= 2000) {\r\n displayValue = displayValue.substring(0, 500) + '... (truncated, ' + displayValue.length + ' chars)';\r\n }\r\n html += `<div class=\"kupola-devtools__list-item\"><div><span class=\"kupola-devtools__storage-key\">${item.key}</span></div><div class=\"kupola-devtools__storage-value\">${displayValue}</div></div>`;\r\n });\r\n \r\n return html;\r\n }\r\n\r\n handleStorageClick(e) {\r\n const target = e.target;\r\n if (target.classList.contains('kupola-devtools__sub-tab')) {\r\n e.stopPropagation();\r\n const type = target.dataset.storage;\r\n if (type) {\r\n this.activeStorageType = type;\r\n this.updateStorageTabs();\r\n const content = this.panel.querySelector('.kupola-devtools__content');\r\n if (content) {\r\n content.innerHTML = this.getStorageContent(type);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction initDevTools() {\r\n try {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const enabled = urlParams.has('dev') || urlParams.has('debug');\r\n \r\n if (enabled) {\r\n window.kupolaDevTools = new KupolaDevTools({ enabled: true });\r\n window.kupolaDevTools.init();\r\n \r\n window.addEventListener('click', (e) => {\r\n if (window.kupolaDevTools && window.kupolaDevTools.handleStorageClick) {\r\n window.kupolaDevTools.handleStorageClick(e);\r\n }\r\n });\r\n }\r\n } catch (error) {\r\n console.error('Error initializing Kupola DevTools:', error);\r\n }\r\n}\r\n\r\nif (document.readyState === 'loading') {\r\n document.addEventListener('DOMContentLoaded', initDevTools);\r\n} else {\r\n initDevTools();\r\n}\r\n\r\nwindow.KupolaDevTools = KupolaDevTools;","/**\r\n * Lightweight icon set inspired by Lucide / shadcn — square, 2px stroke,\r\n * butt caps, miter joins. Use <i data-icon=\"name\"></i> and call Icons.render().\r\n */\r\n(function (global) {\r\n const ATTRS = 'xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\"';\r\n\r\n const PATHS = {\r\n // navigation\r\n 'globe': '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M2 12h20\"/><path d=\"M12 2a15.3 15.3 0 0 1 0 20\"/><path d=\"M12 2a15.3 15.3 0 0 0 0 20\"/>',\r\n 'dashboard': '<rect x=\"3\" y=\"3\" width=\"7\" height=\"9\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"5\"/><rect x=\"14\" y=\"12\" width=\"7\" height=\"9\"/><rect x=\"3\" y=\"16\" width=\"7\" height=\"5\"/>',\r\n 'mouse': '<rect x=\"6\" y=\"2\" width=\"12\" height=\"20\" rx=\"6\"/><line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"11\"/>',\r\n 'search': '<circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m20 20-3.5-3.5\"/>',\r\n 'square': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/>',\r\n 'circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/>',\r\n 'list': '<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>',\r\n 'palette': '<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\"/>',\r\n 'type': '<polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>',\r\n 'ruler': '<rect x=\"3\" y=\"9\" width=\"18\" height=\"6\" transform=\"rotate(-45 12 12)\"/><line x1=\"7.5\" y1=\"12.5\" x2=\"9\" y2=\"14\"/><line x1=\"11\" y1=\"9\" x2=\"12.5\" y2=\"10.5\"/><line x1=\"14.5\" y1=\"5.5\" x2=\"16\" y2=\"7\"/>',\r\n 'sparkles': '<path d=\"M12 3l1.8 4.2L18 9l-4.2 1.8L12 15l-1.8-4.2L6 9l4.2-1.8L12 3z\"/><path d=\"M19 14l1 2.2 2.2 1-2.2 1L19 20.4l-1-2.2-2.2-1 2.2-1L19 14z\"/>',\r\n // actions\r\n 'copy': '<rect x=\"8\" y=\"8\" width=\"13\" height=\"13\"/><path d=\"M16 8V4H4v13h4\"/>',\r\n 'download': '<path d=\"M12 3v12\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/>',\r\n 'refresh': '<polyline points=\"21 4 21 10 15 10\"/><polyline points=\"3 20 3 14 9 14\"/><path d=\"M20.5 9A9 9 0 0 0 5 5.5L3 7M3.5 15A9 9 0 0 0 19 18.5L21 17\"/>',\r\n 'external': '<polyline points=\"14 4 20 4 20 10\"/><line x1=\"20\" y1=\"4\" x2=\"11\" y2=\"13\"/><path d=\"M20 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5\"/>',\r\n 'settings': '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3H9a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8V9a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"/>',\r\n 'sliders': '<line x1=\"4\" y1=\"21\" x2=\"4\" y2=\"14\"/><line x1=\"4\" y1=\"10\" x2=\"4\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"3\"/><line x1=\"20\" y1=\"21\" x2=\"20\" y2=\"16\"/><line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"3\"/><line x1=\"1\" y1=\"14\" x2=\"7\" y2=\"14\"/><line x1=\"9\" y1=\"8\" x2=\"15\" y2=\"8\"/><line x1=\"17\" y1=\"16\" x2=\"23\" y2=\"16\"/>',\r\n 'plus': '<line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>',\r\n 'minus': '<line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>',\r\n 'x': '<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>',\r\n 'github': '<path d=\"M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2 2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2 4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12 12 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6-.6.6-.6 1.2-.5 2V21\"/>',\r\n 'message-circle':'<path d=\"M21 12a9 9 0 0 1-13.5 7.8L3 21l1.2-4.5A9 9 0 1 1 21 12z\"/>',\r\n // SOLO chat title-bar glyphs (Figma 2510_18334) — round bubble + plus,\r\n // 4-tooth gear with center circle, and person-in-circle account avatar.\r\n 'message-plus':'<path d=\"M21 12a9 9 0 0 1-13.5 7.8L3 21l1.2-4.5A9 9 0 1 1 21 12z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"15\"/><line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\"/>',\r\n 'gear': '<path d=\"M9.3 5.7 6.375 5.025 5.025 6.375 5.7 9.3 3 11.1 3 12.9 5.7 14.7 5.025 17.625 6.375 18.975 9.3 18.3 11.1 21 12.9 21 14.7 18.3 17.625 18.975 18.975 17.625 18.3 14.7 21 12.9 21 11.1 18.3 9.3 18.975 6.375 17.625 5.025 14.7 5.7 12.9 3 11.1 3 9.3 5.7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\r\n 'user-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"10\" r=\"2.5\"/><path d=\"M7 17.5a5 5 0 0 1 10 0\"/>',\r\n 'shield': '<path d=\"M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6z\"/>',\r\n 'check': '<polyline points=\"4 12 10 18 20 6\"/>',\r\n 'arrow-right': '<line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><polyline points=\"14 6 20 12 14 18\"/>',\r\n 'arrow-up-right': '<line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/><polyline points=\"9 6 18 6 18 15\"/>',\r\n 'chevron-right':'<polyline points=\"9 6 15 12 9 18\"/>',\r\n 'chevron-down':'<polyline points=\"6 9 12 15 18 9\"/>',\r\n // status — strict outline, 24x24, 2px stroke (no filled bowls)\r\n 'check-circle':'<circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"8 12 11 15 16 9\"/>',\r\n 'alert-circle':'<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"16.01\"/>',\r\n 'alert-triangle':'<path d=\"M12 3 22 20 2 20 Z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"15\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\"/>',\r\n 'info-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n 'x-circle': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/><line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>',\r\n // legacy aliases — kept outline, square frame\r\n 'alert': '<path d=\"M12 3 22 20 2 20 Z\"/><line x1=\"12\" y1=\"10\" x2=\"12\" y2=\"15\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18.01\"/>',\r\n 'info': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n // misc\r\n 'mail': '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\"/><polyline points=\"3 6 12 13 21 6\"/>',\r\n 'user': '<path d=\"M4 21v-1a6 6 0 0 1 6-6h4a6 6 0 0 1 6 6v1\"/><circle cx=\"12\" cy=\"8\" r=\"4\"/>',\r\n 'users': '<path d=\"M2 21v-1a5 5 0 0 1 5-5h3a5 5 0 0 1 5 5v1\"/><circle cx=\"8.5\" cy=\"8\" r=\"3.5\"/><path d=\"M22 21v-1a5 5 0 0 0-4-4.9\"/><path d=\"M16 3.1A4 4 0 0 1 16 11\"/>',\r\n 'box': '<polyline points=\"3 7 12 2 21 7 21 17 12 22 3 17 3 7\"/><line x1=\"3\" y1=\"7\" x2=\"12\" y2=\"12\"/><line x1=\"21\" y1=\"7\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"12\"/>',\r\n 'zap': '<polygon points=\"13 2 4 14 12 14 11 22 20 10 12 10 13 2\"/>',\r\n 'moon': '<path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z\"/>',\r\n 'sun': '<circle cx=\"12\" cy=\"12\" r=\"4\"/><line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"5\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"22\"/><line x1=\"2\" y1=\"12\" x2=\"5\" y2=\"12\"/><line x1=\"19\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"4.6\" y1=\"4.6\" x2=\"6.7\" y2=\"6.7\"/><line x1=\"17.3\" y1=\"17.3\" x2=\"19.4\" y2=\"19.4\"/><line x1=\"4.6\" y1=\"19.4\" x2=\"6.7\" y2=\"17.3\"/><line x1=\"17.3\" y1=\"6.7\" x2=\"19.4\" y2=\"4.6\"/>',\r\n 'cmd': '<path d=\"M9 6h6v12H9z\"/><rect x=\"3\" y=\"3\" width=\"6\" height=\"6\"/><rect x=\"15\" y=\"3\" width=\"6\" height=\"6\"/><rect x=\"3\" y=\"15\" width=\"6\" height=\"6\"/><rect x=\"15\" y=\"15\" width=\"6\" height=\"6\"/>',\r\n 'key': '<circle cx=\"7.5\" cy=\"14.5\" r=\"3.5\"/><line x1=\"10\" y1=\"12\" x2=\"22\" y2=\"12\"/><line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"16\"/><line x1=\"18\" y1=\"12\" x2=\"18\" y2=\"15\"/>',\r\n 'bell': '<path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 8 3 8H3s3-1 3-8z\"/><path d=\"M10 21a2 2 0 0 0 4 0\"/>',\r\n 'arrow-up': '<line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"/><polyline points=\"6 10 12 4 18 10\"/>',\r\n 'chevron-up': '<polyline points=\"6 15 12 9 18 15\"/>',\r\n 'arrow-left': '<line x1=\"20\" y1=\"12\" x2=\"4\" y2=\"12\"/><polyline points=\"10 6 4 12 10 18\"/>',\r\n 'mic': '<rect x=\"9\" y=\"3\" width=\"6\" height=\"12\" rx=\"3\"/><path d=\"M5 11a7 7 0 0 0 14 0\"/><line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"22\"/>',\r\n 'at': '<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\"/>',\r\n 'hash': '<line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\"/><line x1=\"4\" y1=\"15\" x2=\"20\" y2=\"15\"/><line x1=\"10\" y1=\"3\" x2=\"8\" y2=\"21\"/><line x1=\"16\" y1=\"3\" x2=\"14\" y2=\"21\"/>',\r\n 'sidebar-left': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/>',\r\n 'sidebar-right': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/>',\r\n 'panel-bottom': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\"/>',\r\n /* ===== Activity-bar icon set =====================================\r\n * Lucide / shadcn-ui (MIT) — squared outline, 2px stroke. Every glyph\r\n * draws into the same standard 24-grid bbox (≈3..21) so they read at\r\n * identical optical size when sized via `data-size` alone, just like\r\n * every other glyph in this file. See skill.md §13.4. */\r\n 'git': '<circle cx=\"6\" cy=\"5\" r=\"3\"/><circle cx=\"6\" cy=\"19\" r=\"3\"/><circle cx=\"18\" cy=\"5\" r=\"3\"/><line x1=\"6\" y1=\"8\" x2=\"6\" y2=\"16\"/><path d=\"M18 8v3a4 4 0 0 1-4 4h-4\"/>',\r\n 'bug': '<rect x=\"8\" y=\"6\" width=\"8\" height=\"14\" rx=\"4\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"20\"/><line x1=\"3\" y1=\"9\" x2=\"8\" y2=\"9\"/><line x1=\"3\" y1=\"14\" x2=\"8\" y2=\"14\"/><line x1=\"3\" y1=\"19\" x2=\"8\" y2=\"19\"/><line x1=\"16\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"16\" y1=\"14\" x2=\"21\" y2=\"14\"/><line x1=\"16\" y1=\"19\" x2=\"21\" y2=\"19\"/><line x1=\"9\" y1=\"6\" x2=\"9\" y2=\"3\"/><line x1=\"15\" y1=\"6\" x2=\"15\" y2=\"3\"/>',\r\n 'search-menu': '<circle cx=\"11\" cy=\"11\" r=\"6\"/><line x1=\"20\" y1=\"20\" x2=\"16\" y2=\"16\"/><line x1=\"3\" y1=\"20\" x2=\"13\" y2=\"20\"/>',\r\n 'extensions': '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/><path d=\"M17.5 14v3.5H21a2 2 0 0 1 0 4h-3.5V21a2 2 0 0 1-4 0v-3.5H14a2 2 0 0 1 0-4h3.5z\"/>',\r\n // settings sidebar — squared, hard-edged outline (Lucide-ish), 2px stroke\r\n 'wrench': '<path d=\"M14.7 6.3a4 4 0 0 0 5 5L21 12.5l-7.5 7.5a3 3 0 0 1-4.2-4.2L16.7 8 14.7 6.3z\"/><path d=\"M14.7 6.3 12 9l-3-3 2.7-2.7a4 4 0 0 1 3 3z\"/>',\r\n 'message-square': '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\r\n 'file-text': '<path d=\"M14 3H6v18h12V8z\"/><polyline points=\"14 3 14 8 18 8\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/><line x1=\"9\" y1=\"17\" x2=\"15\" y2=\"17\"/>',\r\n 'scroll-text': '<path d=\"M5 4h11a3 3 0 0 1 3 3v10H8v3a1 1 0 0 1-1 1 3 3 0 0 1-3-3V7a3 3 0 0 1 1-3z\"/><line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"9\"/><line x1=\"9\" y1=\"13\" x2=\"15\" y2=\"13\"/>',\r\n 'atom': '<circle cx=\"12\" cy=\"12\" r=\"2\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\" transform=\"rotate(60 12 12)\"/><ellipse cx=\"12\" cy=\"12\" rx=\"10\" ry=\"4\" transform=\"rotate(120 12 12)\"/>',\r\n 'arrow-right-to-line': '<line x1=\"20\" y1=\"4\" x2=\"20\" y2=\"20\"/><line x1=\"3\" y1=\"12\" x2=\"17\" y2=\"12\"/><polyline points=\"11 6 17 12 11 18\"/>',\r\n 'info-square': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8.01\"/>',\r\n /* Window-control glyphs for SOLO top bar (Figma 2510_20754):\r\n * .arrow-minimize → diagonal-in arrows (collapse to corners)\r\n * .icon-expand → diagonal-out arrows (expand to corners) */\r\n 'arrow-minimize': '<polyline points=\"20 4 14 10 20 10\"/><line x1=\"14\" y1=\"10\" x2=\"14\" y2=\"4\"/><polyline points=\"4 20 10 14 4 14\"/><line x1=\"10\" y1=\"14\" x2=\"10\" y2=\"20\"/>',\r\n 'arrow-expand': '<polyline points=\"14 4 20 4 20 10\"/><line x1=\"14\" y1=\"10\" x2=\"20\" y2=\"4\"/><polyline points=\"10 20 4 20 4 14\"/><line x1=\"10\" y1=\"14\" x2=\"4\" y2=\"20\"/>',\r\n 'arrow-down': '<line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/><polyline points=\"6 14 12 20 18 14\"/>',\r\n 'logo': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>',\r\n // additional UI\r\n 'more-h': '<circle cx=\"5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/><circle cx=\"19\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/>',\r\n 'edit': '<path d=\"M4 20h4l10-10-4-4L4 16v4z\"/><path d=\"M14 6l4 4\"/>',\r\n 'trash': '<polyline points=\"4 6 20 6\"/><path d=\"M6 6v14h12V6\"/><path d=\"M9 6V4h6v2\"/><line x1=\"10\" y1=\"10\" x2=\"10\" y2=\"17\"/><line x1=\"14\" y1=\"10\" x2=\"14\" y2=\"17\"/>',\r\n 'file': '<path d=\"M14 3H6v18h12V7z\"/><polyline points=\"14 3 14 7 18 7\"/>',\r\n // Stacked documents — Lucide \"files\" (3..21).\r\n 'files': '<path d=\"M21 8v13H8V3h8z\"/><polyline points=\"16 3 16 8 21 8\"/><path d=\"M8 7H3v14h13v-3\"/>',\r\n // Pure 2×2 grid — Lucide \"layout-grid\" (3..21).\r\n 'grid-2x2': '<rect x=\"3\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"3\" width=\"8\" height=\"8\"/><rect x=\"3\" y=\"13\" width=\"8\" height=\"8\"/><rect x=\"13\" y=\"13\" width=\"8\" height=\"8\"/>',\r\n 'folder': '<path d=\"M3 6h6l2 3h10v10H3z\"/>',\r\n 'layers': '<polygon points=\"12 3 22 8 12 13 2 8 12 3\"/><polyline points=\"2 13 12 18 22 13\"/>',\r\n 'layout': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>',\r\n 'terminal': '<polyline points=\"4 7 9 12 4 17\"/><line x1=\"12\" y1=\"17\" x2=\"20\" y2=\"17\"/>',\r\n 'image': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\"/><polyline points=\"3 18 9 12 13 16 17 12 21 16\"/>',\r\n 'play': '<polygon points=\"6 4 20 12 6 20 6 4\"/>',\r\n 'pause': '<rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/>',\r\n 'help': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><path d=\"M9 9a3 3 0 0 1 6 0c0 2-3 2-3 4\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"17.01\"/>',\r\n 'lock': '<rect x=\"4\" y=\"11\" width=\"16\" height=\"10\"/><path d=\"M8 11V8a4 4 0 0 1 8 0v3\"/>',\r\n // Lucide \"eye\" (2..22 horizontal, naturally short — eye shape).\r\n 'eye': '<path d=\"M2 12s4-7 10-7 10 7 10 7-4 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/>',\r\n 'star': '<polygon points=\"12 3 15 9 22 10 17 14 18 21 12 18 6 21 7 14 2 10 9 9 12 3\"/>',\r\n 'heart': '<path d=\"M12 21s-7-5-7-11a4 4 0 0 1 7-2 4 4 0 0 1 7 2c0 6-7 11-7 11z\"/>',\r\n 'home': '<polygon points=\"3 11 12 3 21 11 21 21 14 21 14 14 10 14 10 21 3 21 3 11\"/>',\r\n 'calendar': '<rect x=\"3\" y=\"5\" width=\"18\" height=\"16\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"7\"/><line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"7\"/>',\r\n 'clock': '<circle cx=\"12\" cy=\"12\" r=\"9\"/><polyline points=\"12 7 12 12 16 14\"/>',\r\n 'filter': '<polygon points=\"3 4 21 4 14 12 14 20 10 18 10 12 3 4\"/>',\r\n 'send': '<polygon points=\"3 12 21 4 17 21 12 13 3 12\"/>',\r\n 'link': '<path d=\"M10 14a4 4 0 0 1 0-6l3-3a4 4 0 0 1 6 6l-1.5 1.5\"/><path d=\"M14 10a4 4 0 0 1 0 6l-3 3a4 4 0 0 1-6-6l1.5-1.5\"/>',\r\n 'upload': '<path d=\"M12 21V9\"/><polyline points=\"7 14 12 9 17 14\"/><line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"3\"/>',\r\n 'log-out': '<path d=\"M14 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9\"/><polyline points=\"16 16 21 12 16 8\"/><line x1=\"9\" y1=\"12\" x2=\"21\" y2=\"12\"/>',\r\n 'menu': '<line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"/>',\r\n // data / charts\r\n 'dollar': '<line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\"/><path d=\"M17 6H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6\"/>',\r\n 'bar': '<line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"21\"/><rect x=\"5\" y=\"11\" width=\"3\" height=\"8\"/><rect x=\"10.5\" y=\"6\" width=\"3\" height=\"13\"/><rect x=\"16\" y=\"14\" width=\"3\" height=\"5\"/>',\r\n 'trending-up': '<polyline points=\"3 17 9 11 13 15 21 7\"/><polyline points=\"15 7 21 7 21 13\"/>',\r\n 'trending-down': '<polyline points=\"3 7 9 13 13 9 21 17\"/><polyline points=\"15 17 21 17 21 11\"/>',\r\n 'columns': '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\"/>',\r\n // settings — framework rules\r\n 'plug': '<path d=\"M9 2v6\"/><path d=\"M15 2v6\"/><path d=\"M7 8h10v4a5 5 0 0 1-10 0V8z\"/><path d=\"M12 17v5\"/>',\r\n 'cpu': '<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\"/><rect x=\"9\" y=\"9\" width=\"6\" height=\"6\"/><line x1=\"9\" y1=\"2\" x2=\"9\" y2=\"6\"/><line x1=\"15\" y1=\"2\" x2=\"15\" y2=\"6\"/><line x1=\"9\" y1=\"18\" x2=\"9\" y2=\"22\"/><line x1=\"15\" y1=\"18\" x2=\"15\" y2=\"22\"/><line x1=\"2\" y1=\"9\" x2=\"6\" y2=\"9\"/><line x1=\"2\" y1=\"15\" x2=\"6\" y2=\"15\"/><line x1=\"18\" y1=\"9\" x2=\"22\" y2=\"9\"/><line x1=\"18\" y1=\"15\" x2=\"22\" y2=\"15\"/>',\r\n 'code': '<polyline points=\"16 18 22 12 16 6\"/><polyline points=\"8 6 2 12 8 18\"/>',\r\n // brand — filled Apple glyph for download CTA\r\n 'apple': '<path fill=\"currentColor\" stroke=\"none\" d=\"M17.05 12.04c-.03-3.04 2.49-4.5 2.6-4.57-1.42-2.07-3.62-2.36-4.4-2.39-1.87-.19-3.65 1.1-4.6 1.1-.96 0-2.42-1.08-3.98-1.05-2.05.03-3.94 1.19-4.99 3.02-2.13 3.69-.54 9.13 1.53 12.12 1.01 1.46 2.21 3.1 3.78 3.04 1.52-.06 2.09-.98 3.93-.98 1.83 0 2.36.98 3.97.95 1.64-.03 2.68-1.49 3.68-2.96 1.16-1.7 1.64-3.35 1.66-3.43-.04-.02-3.18-1.22-3.21-4.85zM14.06 4.34c.83-1.01 1.39-2.41 1.24-3.81-1.2.05-2.65.8-3.51 1.8-.77.89-1.45 2.31-1.27 3.68 1.34.1 2.71-.68 3.54-1.67z\"/>',\r\n };\r\n\r\n function svg(name, size = 16, viewBox = '0 0 24 24') {\r\n const path = PATHS[name];\r\n if (!path) return '';\r\n const attrs = ATTRS\r\n .replace('width=\"16\"', `width=\"${size}\"`)\r\n .replace('height=\"16\"', `height=\"${size}\"`)\r\n .replace('viewBox=\"0 0 24 24\"', `viewBox=\"${viewBox}\"`);\r\n return `<svg ${attrs}>${path}</svg>`;\r\n }\r\n\r\n function render(root = document) {\r\n root.querySelectorAll('[data-icon]').forEach(el => {\r\n const name = el.getAttribute('data-icon');\r\n const size = +el.getAttribute('data-size') || 16;\r\n const vb = el.getAttribute('data-viewbox') || '0 0 24 24';\r\n el.innerHTML = svg(name, size, vb);\r\n el.classList.add('icon');\r\n });\r\n }\r\n\r\n global.Icons = { svg, render, PATHS };\r\n if (document.readyState !== 'loading') render();\r\n else document.addEventListener('DOMContentLoaded', () => render());\r\n})(typeof window !== 'undefined' ? window : globalThis);\r\n","class Countdown {\r\n constructor(element) {\r\n this.element = element;\r\n this.hoursEl = element.querySelector('.ds-countdown__item--hours .ds-countdown__value');\r\n this.minutesEl = element.querySelector('.ds-countdown__item--minutes .ds-countdown__value');\r\n this.secondsEl = element.querySelector('.ds-countdown__item--seconds .ds-countdown__value');\r\n \r\n this.endTime = this.parseEndTime();\r\n this.interval = null;\r\n \r\n this.init();\r\n }\r\n\r\n parseEndTime() {\r\n const dataEndTime = this.element.getAttribute('data-end-time');\r\n if (dataEndTime) {\r\n return new Date(dataEndTime).getTime();\r\n }\r\n \r\n const dataHours = parseInt(this.element.getAttribute('data-hours')) || 0;\r\n const dataMinutes = parseInt(this.element.getAttribute('data-minutes')) || 0;\r\n const dataSeconds = parseInt(this.element.getAttribute('data-seconds')) || 0;\r\n \r\n return new Date().getTime() + (dataHours * 3600 + dataMinutes * 60 + dataSeconds) * 1000;\r\n }\r\n\r\n init() {\r\n this.update();\r\n this.start();\r\n }\r\n\r\n start() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n }\r\n this.interval = setInterval(() => {\r\n this.update();\r\n }, 1000);\r\n }\r\n\r\n stop() {\r\n if (this.interval) {\r\n clearInterval(this.interval);\r\n this.interval = null;\r\n }\r\n }\r\n\r\n reset() {\r\n this.stop();\r\n this.endTime = this.parseEndTime();\r\n this.init();\r\n }\r\n\r\n update() {\r\n const now = new Date().getTime();\r\n const distance = this.endTime - now;\r\n \r\n if (distance <= 0) {\r\n this.stop();\r\n this.displayTime(0, 0, 0);\r\n this.dispatchComplete();\r\n return;\r\n }\r\n \r\n const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\r\n const seconds = Math.floor((distance % (1000 * 60)) / 1000);\r\n \r\n this.displayTime(hours, minutes, seconds);\r\n }\r\n\r\n displayTime(hours, minutes, seconds) {\r\n if (this.hoursEl) {\r\n this.hoursEl.textContent = String(hours).padStart(2, '0');\r\n }\r\n if (this.minutesEl) {\r\n this.minutesEl.textContent = String(minutes).padStart(2, '0');\r\n }\r\n if (this.secondsEl) {\r\n this.secondsEl.textContent = String(seconds).padStart(2, '0');\r\n }\r\n }\r\n\r\n setEndTime(date) {\r\n this.endTime = date.getTime();\r\n this.update();\r\n }\r\n\r\n addTime(seconds) {\r\n this.endTime += seconds * 1000;\r\n this.update();\r\n }\r\n\r\n dispatchComplete() {\r\n this.element.dispatchEvent(new CustomEvent('ds-countdown-complete', {\r\n detail: {}\r\n }));\r\n }\r\n\r\n destroy() {\r\n this.stop();\r\n this.hoursEl = null;\r\n this.minutesEl = null;\r\n this.secondsEl = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initCountdown(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n const instance = new Countdown(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n}\r\n\r\nfunction cleanupCountdown(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initCountdowns() {\r\n const countdowns = document.querySelectorAll('.ds-countdown');\r\n countdowns.forEach(el => {\r\n initCountdown(el);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { Countdown, initCountdowns, initCountdown, cleanupCountdown };\r\n} else {\r\n window.Countdown = Countdown;\r\n window.initCountdown = initCountdown;\r\n window.cleanupCountdown = cleanupCountdown;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('countdown', initCountdown, cleanupCountdown);\r\n}","class NumberInput {\r\n constructor(element) {\r\n this.element = element;\r\n this.minusBtn = element.querySelector('.ds-number-input__btn--decrease');\r\n this.plusBtn = element.querySelector('.ds-number-input__btn--increase');\r\n this.inputEl = element.querySelector('.ds-number-input__input');\r\n this._listeners = [];\r\n\r\n if (!this.minusBtn || !this.plusBtn || !this.inputEl) {\r\n throw new Error('NumberInput: Missing required elements');\r\n }\r\n\r\n this.min = parseInt(this.inputEl.getAttribute('min')) || -Infinity;\r\n this.max = parseInt(this.inputEl.getAttribute('max')) || Infinity;\r\n this.step = parseInt(this.inputEl.getAttribute('step')) || 1;\r\n\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bindEvents();\r\n this.updateState();\r\n }\r\n\r\n bindEvents() {\r\n const minusHandler = () => this.updateValue(-this.step);\r\n const plusHandler = () => this.updateValue(this.step);\r\n const inputHandler = () => this.handleInput();\r\n\r\n this.minusBtn.addEventListener('click', minusHandler);\r\n this.plusBtn.addEventListener('click', plusHandler);\r\n this.inputEl.addEventListener('input', inputHandler);\r\n\r\n this._listeners.push(\r\n { el: this.minusBtn, event: 'click', handler: minusHandler },\r\n { el: this.plusBtn, event: 'click', handler: plusHandler },\r\n { el: this.inputEl, event: 'input', handler: inputHandler }\r\n );\r\n }\r\n\r\n updateValue(delta) {\r\n let value = parseInt(this.inputEl.value) || 0;\r\n value += delta;\r\n\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n\r\n this.inputEl.value = value;\r\n this.inputEl.dispatchEvent(new Event('change'));\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n handleInput() {\r\n let value = parseInt(this.inputEl.value);\r\n if (isNaN(value)) value = 0;\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n this.inputEl.value = value;\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n updateState() {\r\n const value = parseInt(this.inputEl.value) || 0;\r\n this.minusBtn.disabled = value <= this.min;\r\n this.plusBtn.disabled = value >= this.max;\r\n }\r\n\r\n setValue(value) {\r\n if (value < this.min) value = this.min;\r\n if (value > this.max) value = this.max;\r\n this.inputEl.value = value;\r\n this.updateState();\r\n this.dispatchChange();\r\n }\r\n\r\n getValue() {\r\n return parseInt(this.inputEl.value) || 0;\r\n }\r\n\r\n setRange(min, max) {\r\n this.min = min;\r\n this.max = max;\r\n this.updateState();\r\n }\r\n\r\n dispatchChange() {\r\n this.element.dispatchEvent(new CustomEvent('ds-number-input-change', {\r\n detail: {\r\n value: this.getValue()\r\n }\r\n }));\r\n }\r\n\r\n destroy() {\r\n this._listeners.forEach(({ el, event, handler }) => {\r\n el.removeEventListener(event, handler);\r\n });\r\n this._listeners = null;\r\n this.minusBtn = null;\r\n this.plusBtn = null;\r\n this.inputEl = null;\r\n this.element = null;\r\n }\r\n}\r\n\r\nfunction initNumberInput(element) {\r\n if (element.__kupolaInitialized) return;\r\n\r\n try {\r\n const instance = new NumberInput(element);\r\n element.__kupolaInstance = instance;\r\n element.__kupolaInitialized = true;\r\n } catch (error) {\r\n console.error('[NumberInput] Error initializing:', error);\r\n }\r\n}\r\n\r\nfunction cleanupNumberInput(element) {\r\n if (!element.__kupolaInitialized || !element.__kupolaInstance) return;\r\n\r\n const instance = element.__kupolaInstance;\r\n instance.destroy();\r\n\r\n element.__kupolaInstance = null;\r\n element.__kupolaInitialized = false;\r\n}\r\n\r\nfunction initNumberInputs() {\r\n document.querySelectorAll('.ds-number-input').forEach(input => {\r\n initNumberInput(input);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { NumberInput, initNumberInputs, initNumberInput, cleanupNumberInput };\r\n} else {\r\n window.NumberInput = NumberInput;\r\n window.initNumberInput = initNumberInput;\r\n window.cleanupNumberInput = cleanupNumberInput;\r\n}\r\n\r\nif (window.kupolaInitializer) {\r\n window.kupolaInitializer.register('number-input', initNumberInput, cleanupNumberInput);\r\n}","class SlideCaptcha {\r\n constructor(container) {\r\n this.container = container;\r\n this.track = container.querySelector('.ds-slider-captcha__track');\r\n this.btn = container.querySelector('.ds-slider-captcha__btn');\r\n this.text = container.querySelector('.ds-slider-captcha__text');\r\n this.progress = container.querySelector('.ds-slider-captcha__progress');\r\n this.statusEl = container.querySelector('.ds-slider-captcha__status');\r\n this.refreshBtn = container.querySelector('.ds-slider-captcha__refresh');\r\n this.footerRefreshBtn = container.querySelector('.ds-slider-captcha__footer-refresh');\r\n \r\n this.config = {\r\n tolerance: 6,\r\n minPoints: 20,\r\n minDuration: 300,\r\n maxDuration: 10000,\r\n minSpeedDelta: 0.3,\r\n maxAttempts: 5\r\n };\r\n \r\n this.isDragging = false;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.currentX = 0;\r\n this.trackData = [];\r\n this.startTime = 0;\r\n this.isVerified = false;\r\n this.isProcessing = false;\r\n this.attempts = 0;\r\n \r\n this.targetX = 0;\r\n this.distractorX = 0;\r\n this.angle = 0;\r\n this.distractorAngle = 0;\r\n this.maxAngle = parseInt(container.getAttribute('data-angle')) || 30;\r\n this.shape = container.getAttribute('data-shape') || 'circle';\r\n this.hasDistractor = this.shape !== 'circle';\r\n \r\n this.scope = `slidecaptcha-${Math.random().toString(36).substr(2, 9)}`;\r\n \r\n this._mouseDownHandler = null;\r\n this._mouseMoveHandler = null;\r\n this._mouseUpHandler = null;\r\n this._touchStartHandler = null;\r\n this._touchMoveHandler = null;\r\n this._touchEndHandler = null;\r\n \r\n this._mouseMoveListener = null;\r\n this._mouseUpListener = null;\r\n this._touchMoveListener = null;\r\n this._touchEndListener = null;\r\n }\r\n\r\n init() {\r\n if (!this.track || !this.btn) return;\r\n if (this.container._initialized) return;\r\n\r\n this._mouseDownHandler = (e) => {\r\n if (this.isVerified || this.isProcessing) return;\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.startX = e.clientX;\r\n this.startY = e.clientY;\r\n this.startTime = Date.now();\r\n this.trackData = [];\r\n this.container.classList.add('is-active');\r\n if (this.text) {\r\n this.text.textContent = '拖动中...';\r\n this.text.style.color = 'var(--status-info-default)';\r\n }\r\n };\r\n\r\n this._mouseMoveHandler = (e) => {\r\n if (!this.isDragging) return;\r\n e.preventDefault();\r\n\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const maxOffset = trackWidth - btnWidth - 8;\r\n\r\n let deltaX = e.clientX - this.startX;\r\n if (deltaX < 0) deltaX = 0;\r\n if (deltaX > maxOffset) deltaX = maxOffset;\r\n\r\n this.currentX = deltaX;\r\n this.btn.style.left = (14 + deltaX) + 'px';\r\n if (this.progress) this.progress.style.width = ((deltaX / maxOffset) * 100) + '%';\r\n\r\n this.collectTrack(e.clientX, e.clientY);\r\n };\r\n\r\n this._mouseUpHandler = () => {\r\n if (!this.isDragging) return;\r\n this.isDragging = false;\r\n this.container.classList.remove('is-active');\r\n this.verifyCaptcha();\r\n };\r\n\r\n this._touchStartHandler = (e) => {\r\n if (this.isVerified || this.isProcessing) return;\r\n e.preventDefault();\r\n this.isDragging = true;\r\n this.startX = e.touches[0].clientX;\r\n this.startY = e.touches[0].clientY;\r\n this.startTime = Date.now();\r\n this.trackData = [];\r\n this.container.classList.add('is-active');\r\n if (this.text) {\r\n this.text.textContent = '拖动中...';\r\n this.text.style.color = 'var(--status-info-default)';\r\n }\r\n };\r\n\r\n this._touchMoveHandler = (e) => {\r\n if (!this.isDragging) return;\r\n e.preventDefault();\r\n\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const maxOffset = trackWidth - btnWidth - 8;\r\n\r\n let deltaX = e.touches[0].clientX - this.startX;\r\n if (deltaX < 0) deltaX = 0;\r\n if (deltaX > maxOffset) deltaX = maxOffset;\r\n\r\n this.currentX = deltaX;\r\n this.btn.style.left = (14 + deltaX) + 'px';\r\n if (this.progress) this.progress.style.width = ((deltaX / maxOffset) * 100) + '%';\r\n\r\n this.collectTrack(e.touches[0].clientX, e.touches[0].clientY);\r\n };\r\n\r\n this._touchEndHandler = () => {\r\n if (!this.isDragging) return;\r\n this.isDragging = false;\r\n this.container.classList.remove('is-active');\r\n this.verifyCaptcha();\r\n };\r\n\r\n this.btn.addEventListener('mousedown', this._mouseDownHandler);\r\n\r\n if (window.globalEvents) {\r\n this._mouseMoveListener = window.globalEvents.on(document, 'mousemove', this._mouseMoveHandler, { scope: this.scope });\r\n this._mouseUpListener = window.globalEvents.on(document, 'mouseup', this._mouseUpHandler, { scope: this.scope });\r\n this._touchMoveListener = window.globalEvents.on(document, 'touchmove', this._touchMoveHandler, { scope: this.scope, passive: false });\r\n this._touchEndListener = window.globalEvents.on(document, 'touchend', this._touchEndHandler, { scope: this.scope });\r\n } else {\r\n document.addEventListener('mousemove', this._mouseMoveHandler);\r\n document.addEventListener('mouseup', this._mouseUpHandler);\r\n document.addEventListener('touchmove', this._touchMoveHandler, { passive: false });\r\n document.addEventListener('touchend', this._touchEndHandler);\r\n }\r\n\r\n this.btn.addEventListener('touchstart', this._touchStartHandler, { passive: false });\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.addEventListener('click', () => this.loadCaptcha());\r\n }\r\n if (this.footerRefreshBtn) {\r\n this.footerRefreshBtn.addEventListener('click', () => this.loadCaptcha());\r\n }\r\n\r\n this.container._initialized = true;\r\n this.loadCaptcha();\r\n }\r\n\r\n generateTarget() {\r\n const trackWidth = this.track.offsetWidth;\r\n const btnWidth = this.btn.offsetWidth;\r\n const btnOffset = 14;\r\n const min = trackWidth * 0.35;\r\n const max = trackWidth * 0.85 - btnWidth;\r\n const mid = trackWidth * 0.6;\r\n\r\n this.angle = Math.floor(Math.random() * (this.maxAngle + 1));\r\n\r\n if (this.hasDistractor) {\r\n do {\r\n this.distractorAngle = Math.floor(Math.random() * (this.maxAngle + 1));\r\n } while (Math.abs(this.distractorAngle - this.angle) < 5);\r\n }\r\n\r\n if (this.hasDistractor) {\r\n const rand = Math.random();\r\n if (rand > 0.5) {\r\n this.targetX = Math.floor(min + Math.random() * (mid - min - btnWidth));\r\n this.distractorX = Math.floor(mid + Math.random() * (max - mid));\r\n } else {\r\n this.targetX = Math.floor(mid + Math.random() * (max - mid));\r\n this.distractorX = Math.floor(min + Math.random() * (mid - min - btnWidth));\r\n }\r\n } else {\r\n this.targetX = Math.floor(min + Math.random() * (max - min));\r\n }\r\n\r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) {\r\n target.style.left = (this.targetX + btnOffset + btnWidth / 2) + 'px';\r\n target.style.transform = 'translate(-50%, -50%) rotate(' + this.angle + 'deg)';\r\n target.style.display = 'block';\r\n }\r\n\r\n if (this.hasDistractor) {\r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) {\r\n distractor.style.left = (this.distractorX + btnOffset + btnWidth / 2) + 'px';\r\n distractor.style.transform = 'translate(-50%, -50%) rotate(' + this.distractorAngle + 'deg)';\r\n distractor.style.display = 'block';\r\n }\r\n } else {\r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) {\r\n distractor.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n resetSlider() {\r\n this.btn.className = 'ds-slider-captcha__btn';\r\n this.btn.style.transform = 'rotate(' + this.angle + 'deg)';\r\n this.btn.innerHTML = '';\r\n this.btn.style.left = '14px';\r\n this.btn.style.display = 'block';\r\n if (this.progress) {\r\n this.progress.style.width = '0%';\r\n this.progress.style.display = 'block';\r\n }\r\n if (this.text) {\r\n this.text.textContent = '按住滑块,拖动到缺口位置';\r\n this.text.style.color = '';\r\n }\r\n if (this.refreshBtn) {\r\n this.refreshBtn.style.display = 'none';\r\n }\r\n this.currentX = 0;\r\n this.trackData = [];\r\n this.container.classList.remove('is-verified', 'is-error', 'is-disabled');\r\n }\r\n\r\n loadCaptcha() {\r\n this.isVerified = false;\r\n this.isProcessing = false;\r\n this.attempts = 0;\r\n this.generateTarget();\r\n this.resetSlider();\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '请完成验证';\r\n this.statusEl.className = 'ds-slider-captcha__status';\r\n }\r\n }\r\n\r\n collectTrack(clientX, clientY) {\r\n const now = Date.now();\r\n const t = now - this.startTime;\r\n\r\n let velocity = 0;\r\n let acceleration = 0;\r\n\r\n if (this.trackData.length > 0) {\r\n const last = this.trackData[this.trackData.length - 1];\r\n const dx = this.currentX - last.x;\r\n const dt = t - last.t;\r\n if (dt > 0) {\r\n velocity = dx / dt;\r\n if (this.trackData.length > 1) {\r\n const prev = this.trackData[this.trackData.length - 2];\r\n const prevDt = last.t - prev.t;\r\n if (prevDt > 0) {\r\n const prevV = (last.x - prev.x) / prevDt;\r\n acceleration = velocity - prevV;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.trackData.push({\r\n x: this.currentX,\r\n y: clientY - this.startY,\r\n t: t,\r\n v: velocity,\r\n a: acceleration\r\n });\r\n\r\n const pointCountEl = this.container.querySelector('.ds-slider-captcha__point-count');\r\n if (pointCountEl) {\r\n pointCountEl.textContent = '轨迹点: ' + this.trackData.length;\r\n }\r\n }\r\n\r\n validateTrack() {\r\n if (!this.trackData || this.trackData.length < this.config.minPoints) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const finalX = this.trackData[this.trackData.length - 1].x;\r\n const distractorDiff = this.hasDistractor ? Math.abs(finalX - this.distractorX) : Infinity;\r\n const targetDiff = Math.abs(finalX - this.targetX);\r\n\r\n if (this.hasDistractor && distractorDiff < targetDiff && distractorDiff <= this.config.tolerance) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n if (targetDiff > this.config.tolerance) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const speeds = [];\r\n for (let i = 1; i < this.trackData.length; i++) {\r\n const dx = this.trackData[i].x - this.trackData[i - 1].x;\r\n const dt = this.trackData[i].t - this.trackData[i - 1].t;\r\n if (dt > 0 && dt < 500) {\r\n speeds.push(dx / dt);\r\n }\r\n }\r\n\r\n if (speeds.length < 3) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const maxSpeed = Math.max(...speeds);\r\n const minSpeed = Math.min(...speeds);\r\n if (maxSpeed - minSpeed < this.config.minSpeedDelta) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n let hasYMovement = false;\r\n for (const p of this.trackData) {\r\n if (Math.abs(p.y) > 2) {\r\n hasYMovement = true;\r\n break;\r\n }\r\n }\r\n if (!hasYMovement && this.trackData.length > 20) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const totalTime = this.trackData[this.trackData.length - 1].t;\r\n if (totalTime < this.config.minDuration) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n if (totalTime > this.config.maxDuration) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n\r\n const accelerations = [];\r\n for (let i = 1; i < speeds.length; i++) {\r\n accelerations.push(Math.abs(speeds[i] - speeds[i - 1]));\r\n }\r\n if (accelerations.length > 2) {\r\n const accAvg = accelerations.reduce((a, b) => a + b, 0) / accelerations.length;\r\n if (accAvg < 0.05) {\r\n return { passed: false, msg: '验证失败' };\r\n }\r\n }\r\n\r\n return { passed: true, msg: '验证通过' };\r\n }\r\n\r\n verifyCaptcha() {\r\n if (this.isProcessing || this.isVerified) return;\r\n this.isProcessing = true;\r\n\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '验证中...';\r\n this.statusEl.className = 'ds-slider-captcha__status is-loading';\r\n }\r\n this.btn.style.cursor = 'wait';\r\n this.container.classList.add('is-disabled');\r\n\r\n setTimeout(() => {\r\n const result = this.validateTrack();\r\n this.isProcessing = false;\r\n this.btn.style.cursor = '';\r\n\r\n if (result.passed) {\r\n this.isVerified = true;\r\n this.btn.style.display = 'none';\r\n if (this.progress) this.progress.style.display = 'none';\r\n \r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) target.style.display = 'none';\r\n \r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) distractor.style.display = 'none';\r\n\r\n if (this.text) {\r\n this.text.textContent = '验证通过';\r\n this.text.style.color = 'var(--status-success-default)';\r\n }\r\n if (this.statusEl) {\r\n this.statusEl.textContent = '验证成功';\r\n this.statusEl.className = 'ds-slider-captcha__status is-success';\r\n }\r\n this.container.classList.add('is-verified');\r\n this.container.classList.remove('is-disabled');\r\n\r\n const onVerified = this.container.getAttribute('data-on-verified');\r\n if (onVerified && typeof window[onVerified] === 'function') {\r\n window[onVerified](this.container);\r\n }\r\n } else {\r\n this.attempts++;\r\n\r\n if (this.text) {\r\n this.text.textContent = result.msg;\r\n this.text.style.color = 'var(--status-error-default)';\r\n }\r\n if (this.statusEl) {\r\n this.statusEl.textContent = result.msg;\r\n this.statusEl.className = 'ds-slider-captcha__status is-error';\r\n }\r\n\r\n const errRefresh = this.container.getAttribute('data-err-refresh');\r\n if (errRefresh === 'auto') {\r\n setTimeout(() => {\r\n this.loadCaptcha();\r\n }, 1200);\r\n } else {\r\n this.btn.style.display = 'none';\r\n if (this.progress) this.progress.style.display = 'none';\r\n \r\n const target = this.container.querySelector('.ds-slider-captcha__target');\r\n if (target) target.style.display = 'none';\r\n \r\n const distractor = this.container.querySelector('.ds-slider-captcha__target--distractor');\r\n if (distractor) distractor.style.display = 'none';\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.style.display = 'block';\r\n }\r\n }\r\n }\r\n }, 300);\r\n }\r\n\r\n destroy() {\r\n if (!this.container._initialized) return;\r\n\r\n if (this.btn && this._mouseDownHandler) {\r\n this.btn.removeEventListener('mousedown', this._mouseDownHandler);\r\n }\r\n if (this.btn && this._touchStartHandler) {\r\n this.btn.removeEventListener('touchstart', this._touchStartHandler);\r\n }\r\n\r\n if (this.refreshBtn) {\r\n this.refreshBtn.removeEventListener('click', () => this.loadCaptcha());\r\n }\r\n if (this.footerRefreshBtn) {\r\n this.footerRefreshBtn.removeEventListener('click', () => this.loadCaptcha());\r\n }\r\n\r\n if (this._mouseMoveListener && this._mouseMoveListener.unsubscribe) {\r\n this._mouseMoveListener.unsubscribe();\r\n } else if (this._mouseMoveHandler) {\r\n document.removeEventListener('mousemove', this._mouseMoveHandler);\r\n }\r\n\r\n if (this._mouseUpListener && this._mouseUpListener.unsubscribe) {\r\n this._mouseUpListener.unsubscribe();\r\n } else if (this._mouseUpHandler) {\r\n document.removeEventListener('mouseup', this._mouseUpHandler);\r\n }\r\n\r\n if (this._touchMoveListener && this._touchMoveListener.unsubscribe) {\r\n this._touchMoveListener.unsubscribe();\r\n } else if (this._touchMoveHandler) {\r\n document.removeEventListener('touchmove', this._touchMoveHandler);\r\n }\r\n\r\n if (this._touchEndListener && this._touchEndListener.unsubscribe) {\r\n this._touchEndListener.unsubscribe();\r\n } else if (this._touchEndHandler) {\r\n document.removeEventListener('touchend', this._touchEndHandler);\r\n }\r\n\r\n this.container._initialized = false;\r\n }\r\n}\r\n\r\nfunction initSlideCaptchas() {\r\n document.querySelectorAll('.ds-slider-captcha').forEach(container => {\r\n const captcha = new SlideCaptcha(container);\r\n captcha.init();\r\n container._kupolaSlideCaptcha = captcha;\r\n });\r\n}\r\n\r\nfunction cleanupSlideCaptcha(container) {\r\n if (container._kupolaSlideCaptcha) {\r\n container._kupolaSlideCaptcha.destroy();\r\n container._kupolaSlideCaptcha = null;\r\n }\r\n}\r\n\r\nfunction cleanupAllSlideCaptchas() {\r\n document.querySelectorAll('.ds-slider-captcha').forEach(container => {\r\n cleanupSlideCaptcha(container);\r\n });\r\n}\r\n\r\nif (typeof module !== 'undefined' && module.exports) {\r\n module.exports = { initSlideCaptchas, cleanupSlideCaptcha, cleanupAllSlideCaptchas };\r\n}","(function(window) {\r\n let currentSetupContext = null;\r\n\r\n class SetupContext {\r\n constructor(component) {\r\n this.component = component;\r\n this.lifecycle = (component && component.lifecycle) || null;\r\n this._onMountedHandlers = [];\r\n this._onUnmountedHandlers = [];\r\n this._onUpdatedHandlers = [];\r\n this._watches = [];\r\n this._refs = new Map();\r\n this._computedDeps = new Map();\r\n }\r\n\r\n ref(initialValue = null) {\r\n if (window.kupolaData) {\r\n const key = `__ref_${Math.random().toString(36).slice(2, 11)}__`;\r\n window.kupolaData.set(key, initialValue);\r\n \r\n return {\r\n get value() {\r\n return window.kupolaData.get(key);\r\n },\r\n set value(newValue) {\r\n window.kupolaData.set(key, newValue);\r\n },\r\n _key: key\r\n };\r\n }\r\n\r\n const refObj = {\r\n _value: initialValue,\r\n _subscribers: new Set()\r\n };\r\n\r\n Object.defineProperty(refObj, 'value', {\r\n get() {\r\n return refObj._value;\r\n },\r\n set(newValue) {\r\n if (newValue !== refObj._value) {\r\n refObj._value = newValue;\r\n refObj._subscribers.forEach(sub => sub(newValue));\r\n }\r\n }\r\n });\r\n\r\n return refObj;\r\n }\r\n\r\n reactive(target) {\r\n if (window.kupolaData) {\r\n return window.kupolaData.createReactive(target);\r\n }\r\n\r\n const self = this;\r\n const handler = {\r\n get(target, key) {\r\n if (key === '__isReactive') return true;\r\n if (key === '__raw') return target;\r\n const result = target[key];\r\n if (typeof result === 'object' && result !== null && !result.__isReactive) {\r\n target[key] = self.reactive(result);\r\n }\r\n return target[key];\r\n },\r\n set(target, key, value) {\r\n if (target[key] === value) return true;\r\n target[key] = value;\r\n self._notifyWatchers(key, value);\r\n return true;\r\n },\r\n deleteProperty(target, key) {\r\n delete target[key];\r\n self._notifyWatchers(key, undefined);\r\n return true;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(target, handler);\r\n proxy.__isReactive = true;\r\n return proxy;\r\n }\r\n\r\n onMounted(handler) {\r\n if (this.lifecycle) {\r\n this.lifecycle.on('mount', handler, { name: 'onMounted' });\r\n } else {\r\n this._onMountedHandlers.push(handler);\r\n }\r\n }\r\n\r\n onUnmounted(handler) {\r\n if (this.lifecycle) {\r\n this.lifecycle.on('unmount', handler, { name: 'onUnmounted' });\r\n } else {\r\n this._onUnmountedHandlers.push(handler);\r\n }\r\n }\r\n\r\n onUpdated(handler) {\r\n if (this.lifecycle) {\r\n this.lifecycle.on('update', handler, { name: 'onUpdated' });\r\n } else {\r\n this._onUpdatedHandlers.push(handler);\r\n }\r\n }\r\n\r\n watch(source, handler, options = {}) {\r\n if (typeof source === 'function') {\r\n const watcher = () => {\r\n const newValue = source();\r\n if (newValue !== watcher._oldValue) {\r\n handler(newValue, watcher._oldValue);\r\n watcher._oldValue = newValue;\r\n }\r\n };\r\n watcher._oldValue = undefined;\r\n this._watches.push(watcher);\r\n watcher();\r\n\r\n if (window.kupolaData) {\r\n const trackedPaths = [];\r\n const originalGet = window.kupolaData.get;\r\n window.kupolaData.get = function(k) {\r\n trackedPaths.push(k);\r\n return originalGet.call(this, k);\r\n };\r\n source();\r\n window.kupolaData.get = originalGet;\r\n \r\n trackedPaths.forEach(path => {\r\n window.kupolaData.observe(path, watcher);\r\n });\r\n }\r\n } else if (typeof source === 'object' && source !== null) {\r\n if (source._subscribers) {\r\n source._subscribers.add(handler);\r\n } else if (source._key && window.kupolaData) {\r\n window.kupolaData.observe(source._key, () => {\r\n handler(source.value);\r\n });\r\n }\r\n }\r\n }\r\n\r\n computed(getter) {\r\n const result = this.ref();\r\n const self = this;\r\n \r\n let update = () => {\r\n try {\r\n result.value = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n const trackedPaths = [];\r\n if (window.kupolaData) {\r\n const originalGet = window.kupolaData.get;\r\n window.kupolaData.get = function(k) {\r\n trackedPaths.push(k);\r\n return originalGet.call(this, k);\r\n };\r\n \r\n update();\r\n \r\n window.kupolaData.get = originalGet;\r\n \r\n trackedPaths.forEach(path => {\r\n window.kupolaData.observe(path, update);\r\n });\r\n \r\n this._computedDeps.set(result, trackedPaths);\r\n } else {\r\n update();\r\n }\r\n\r\n let computedValue = result._value;\r\n \r\n Object.defineProperty(result, 'value', {\r\n get: () => computedValue,\r\n set: (newValue) => {\r\n console.warn('Cannot assign to a computed property');\r\n }\r\n });\r\n\r\n const originalUpdate = update;\r\n update = () => {\r\n try {\r\n computedValue = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n return result;\r\n }\r\n\r\n emit(eventName, data) {\r\n if (this.component) {\r\n this.component.$emit(eventName, data);\r\n }\r\n }\r\n\r\n _notifyWatchers(key, value) {\r\n this._watches.forEach(watcher => {\r\n try { watcher(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n _executeMounted() {\r\n this._onMountedHandlers.forEach(handler => {\r\n try { handler(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n _executeUnmounted() {\r\n this._onUnmountedHandlers.forEach(handler => {\r\n try { handler(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n _executeUpdated() {\r\n this._onUpdatedHandlers.forEach(handler => {\r\n try { handler(); } catch (e) { console.error(e); }\r\n });\r\n }\r\n\r\n destroy() {\r\n this._watches.forEach(watcher => {\r\n if (watcher._subscribers) {\r\n watcher._subscribers.clear();\r\n }\r\n });\r\n this._watches = [];\r\n \r\n this._computedDeps.forEach((paths, result) => {\r\n paths.forEach(path => {\r\n if (window.kupolaData) {\r\n window.kupolaData.unobserve(path);\r\n }\r\n });\r\n });\r\n this._computedDeps.clear();\r\n \r\n this._refs.clear();\r\n this._onMountedHandlers = [];\r\n this._onUnmountedHandlers = [];\r\n this._onUpdatedHandlers = [];\r\n \r\n this.component = null;\r\n this.lifecycle = null;\r\n }\r\n }\r\n\r\n function ref(initialValue = null) {\r\n if (currentSetupContext) {\r\n return currentSetupContext.ref(initialValue);\r\n }\r\n\r\n if (window.kupolaData) {\r\n const key = `__ref_${Math.random().toString(36).slice(2, 11)}__`;\r\n window.kupolaData.set(key, initialValue);\r\n\r\n return {\r\n get value() {\r\n return window.kupolaData.get(key);\r\n },\r\n set value(newValue) {\r\n window.kupolaData.set(key, newValue);\r\n },\r\n _key: key\r\n };\r\n }\r\n\r\n const refObj = {\r\n _value: initialValue,\r\n _subscribers: new Set()\r\n };\r\n\r\n Object.defineProperty(refObj, 'value', {\r\n get() {\r\n return refObj._value;\r\n },\r\n set(newValue) {\r\n if (newValue !== refObj._value) {\r\n refObj._value = newValue;\r\n refObj._subscribers.forEach(sub => sub(newValue));\r\n }\r\n }\r\n });\r\n\r\n return refObj;\r\n }\r\n\r\n function reactive(target) {\r\n if (currentSetupContext) {\r\n return currentSetupContext.reactive(target);\r\n }\r\n\r\n if (window.kupolaData) {\r\n return window.kupolaData.createReactive(target);\r\n }\r\n\r\n const handler = {\r\n get(target, key) {\r\n if (key === '__isReactive') return true;\r\n if (key === '__raw') return target;\r\n const result = target[key];\r\n if (typeof result === 'object' && result !== null && !result.__isReactive) {\r\n target[key] = new Proxy(result, handler);\r\n target[key].__isReactive = true;\r\n }\r\n return target[key];\r\n },\r\n set(target, key, value) {\r\n if (target[key] === value) return true;\r\n target[key] = value;\r\n if (currentSetupContext) {\r\n currentSetupContext._notifyWatchers(key, value);\r\n }\r\n return true;\r\n },\r\n deleteProperty(target, key) {\r\n delete target[key];\r\n if (currentSetupContext) {\r\n currentSetupContext._notifyWatchers(key, undefined);\r\n }\r\n return true;\r\n }\r\n };\r\n\r\n const proxy = new Proxy(target, handler);\r\n proxy.__isReactive = true;\r\n return proxy;\r\n }\r\n\r\n function onMounted(handler) {\r\n if (currentSetupContext) {\r\n currentSetupContext.onMounted(handler);\r\n } else {\r\n console.warn('onMounted called outside of setup()');\r\n }\r\n }\r\n\r\n function onUnmounted(handler) {\r\n if (currentSetupContext) {\r\n currentSetupContext.onUnmounted(handler);\r\n } else {\r\n console.warn('onUnmounted called outside of setup()');\r\n }\r\n }\r\n\r\n function onUpdated(handler) {\r\n if (currentSetupContext) {\r\n currentSetupContext.onUpdated(handler);\r\n } else {\r\n console.warn('onUpdated called outside of setup()');\r\n }\r\n }\r\n\r\n function watch(source, handler, options = {}) {\r\n if (currentSetupContext) {\r\n currentSetupContext.watch(source, handler, options);\r\n }\r\n }\r\n\r\n function computed(getter) {\r\n if (currentSetupContext) {\r\n return currentSetupContext.computed(getter);\r\n }\r\n\r\n const result = ref();\r\n\r\n let update = () => {\r\n try {\r\n result.value = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n if (window.kupolaData) {\r\n const trackedPaths = [];\r\n const originalGet = window.kupolaData.get;\r\n window.kupolaData.get = function(k) {\r\n trackedPaths.push(k);\r\n return originalGet.call(this, k);\r\n };\r\n \r\n update();\r\n \r\n window.kupolaData.get = originalGet;\r\n \r\n trackedPaths.forEach(path => {\r\n window.kupolaData.observe(path, update);\r\n });\r\n } else {\r\n update();\r\n }\r\n\r\n let computedValue = result._value;\r\n \r\n Object.defineProperty(result, 'value', {\r\n get: () => computedValue,\r\n set: (newValue) => {\r\n console.warn('Cannot assign to a computed property');\r\n }\r\n });\r\n\r\n const originalUpdate = update;\r\n update = () => {\r\n try {\r\n computedValue = getter();\r\n } catch (e) {\r\n console.error('Computed property error:', e);\r\n }\r\n };\r\n\r\n return result;\r\n}\r\n\r\n function setup(setupFn) {\r\n if (typeof setupFn !== 'function') {\r\n console.error('setup() requires a function argument');\r\n return;\r\n }\r\n\r\n const setupContext = new SetupContext();\r\n const prevContext = currentSetupContext;\r\n currentSetupContext = setupContext;\r\n\r\n let result;\r\n try {\r\n result = setupFn(setupContext);\r\n } finally {\r\n currentSetupContext = prevContext;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n window.SetupContext = SetupContext;\r\n window.ref = ref;\r\n window.reactive = reactive;\r\n window.onMounted = onMounted;\r\n window.onUnmounted = onUnmounted;\r\n window.onUpdated = onUpdated;\r\n window.watch = watch;\r\n window.computed = computed;\r\n window.setup = setup;\r\n window._getCurrentSetupContext = () => currentSetupContext;\r\n window._setCurrentSetupContext = (ctx) => { currentSetupContext = ctx; };\r\n window._clearSetupContext = () => { currentSetupContext = null; };\r\n})(window);","(function(window) {\r\n class KupolaForm {\r\n constructor(formOrSelector, options = {}) {\r\n this.form = typeof formOrSelector === 'string'\r\n ? document.querySelector(formOrSelector)\r\n : formOrSelector;\r\n \r\n this.options = {\r\n validateOnSubmit: true,\r\n validateOnChange: false,\r\n validateOnBlur: false,\r\n preventDefault: true,\r\n ...options\r\n };\r\n\r\n this.submitHandlers = [];\r\n this.isSubmitting = false;\r\n this.errors = {};\r\n this.rules = {};\r\n this.validator = window.kupolaValidator || new window.KupolaValidator();\r\n\r\n if (!this.form || !(this.form instanceof HTMLFormElement)) {\r\n console.warn('[KupolaForm] Invalid form element');\r\n return;\r\n }\r\n\r\n this._init();\r\n }\r\n\r\n _init() {\r\n if (this.options.validateOnChange) {\r\n this.form.addEventListener('input', (e) => {\r\n this._validateField(e.target);\r\n });\r\n }\r\n\r\n if (this.options.validateOnBlur) {\r\n this.form.addEventListener('blur', (e) => {\r\n if (e.target.form === this.form) {\r\n this._validateField(e.target);\r\n }\r\n }, true);\r\n }\r\n }\r\n\r\n submit(handler) {\r\n const wrappedHandler = async (e) => {\r\n if (this.options.preventDefault) {\r\n e.preventDefault();\r\n }\r\n if (this.isSubmitting) return;\r\n this.isSubmitting = true;\r\n\r\n try {\r\n if (this.options.validateOnSubmit) {\r\n const validation = await this.validate();\r\n if (!validation.valid) {\r\n this._showErrors(validation.errors);\r\n return;\r\n }\r\n }\r\n\r\n const result = handler(e);\r\n if (result instanceof Promise) {\r\n await result;\r\n }\r\n } finally {\r\n this.isSubmitting = false;\r\n }\r\n };\r\n\r\n this.submitHandlers.push(wrappedHandler);\r\n this.form.addEventListener('submit', wrappedHandler);\r\n\r\n return () => {\r\n const index = this.submitHandlers.indexOf(wrappedHandler);\r\n if (index > -1) {\r\n this.submitHandlers.splice(index, 1);\r\n this.form.removeEventListener('submit', wrappedHandler);\r\n }\r\n };\r\n }\r\n\r\n setRules(rules) {\r\n this.rules = { ...this.rules, ...rules };\r\n this._applyRulesToDOM();\r\n return this;\r\n }\r\n\r\n _applyRulesToDOM() {\r\n Object.keys(this.rules).forEach(name => {\r\n const input = this.form.querySelector(`[name=\"${name}\"]`);\r\n if (!input) return;\r\n\r\n const fieldRules = this.rules[name];\r\n const ruleString = this._rulesToString(fieldRules);\r\n input.setAttribute('data-validate', ruleString);\r\n });\r\n }\r\n\r\n _rulesToString(rules) {\r\n if (typeof rules === 'function') {\r\n return 'custom';\r\n }\r\n\r\n const parts = [];\r\n Object.keys(rules).forEach(rule => {\r\n const config = rules[rule];\r\n if (typeof config === 'object' && config !== null) {\r\n if (rule === 'pattern') {\r\n parts.push(`pattern:${config.source?.replace(/\\//g, '')}`);\r\n } else if (rule === 'equalTo') {\r\n parts.push(`equalTo:${config}`);\r\n } else {\r\n parts.push(rule);\r\n }\r\n } else if (typeof config === 'number' || typeof config === 'string') {\r\n parts.push(`${rule}:${config}`);\r\n } else if (config === true) {\r\n parts.push(rule);\r\n }\r\n });\r\n return parts.join('|');\r\n }\r\n\r\n async validate(fields = null) {\r\n this.errors = {};\r\n const allErrors = [];\r\n\r\n const inputs = fields\r\n ? Array.isArray(fields) ? fields : [fields]\r\n : this.form.querySelectorAll('input, select, textarea');\r\n\r\n for (const input of inputs) {\r\n const name = input.name;\r\n if (!name) continue;\r\n\r\n const errors = await this._validateField(input);\r\n if (errors.length > 0) {\r\n this.errors[name] = errors;\r\n allErrors.push(...errors);\r\n }\r\n }\r\n\r\n return {\r\n valid: allErrors.length === 0,\r\n errors: allErrors,\r\n fieldErrors: this.errors\r\n };\r\n }\r\n\r\n async _validateField(input) {\r\n const name = input.name;\r\n const rules = this.rules[name];\r\n\r\n if (typeof rules === 'function') {\r\n const result = rules(input.value.trim(), input);\r\n if (result instanceof Promise) {\r\n const asyncResult = await result;\r\n if (asyncResult !== true) {\r\n const displayName = input.getAttribute('data-label') || input.getAttribute('placeholder') || name;\r\n const message = typeof asyncResult === 'string' ? asyncResult : `${displayName} 验证失败`;\r\n this.validator.showError(input, message);\r\n return [message];\r\n }\r\n } else if (result !== true) {\r\n const displayName = input.getAttribute('data-label') || input.getAttribute('placeholder') || name;\r\n const message = typeof result === 'string' ? result : `${displayName} 验证失败`;\r\n this.validator.showError(input, message);\r\n return [message];\r\n }\r\n this.validator.clearError(input);\r\n return [];\r\n }\r\n\r\n const isValid = await this.validator.validateInputAsync(input);\r\n if (!isValid) {\r\n const errorElement = input.parentElement?.querySelector('.ds-input__error');\r\n return errorElement ? [errorElement.textContent] : ['Validation failed'];\r\n }\r\n return [];\r\n }\r\n\r\n _showErrors(errors) {\r\n if (typeof Message !== 'undefined') {\r\n Message.error(errors.join('\\n'));\r\n } else if (typeof console !== 'undefined') {\r\n console.error('Form validation errors:', errors);\r\n }\r\n }\r\n\r\n getValues() {\r\n const values = {};\r\n const inputs = this.form.querySelectorAll('input, select, textarea');\r\n\r\n inputs.forEach(input => {\r\n const name = input.name;\r\n if (!name) return;\r\n\r\n if (input.type === 'checkbox') {\r\n if (!values[name]) {\r\n values[name] = [];\r\n }\r\n if (input.checked) {\r\n values[name].push(input.value);\r\n }\r\n } else if (input.type === 'radio') {\r\n if (input.checked) {\r\n values[name] = input.value;\r\n }\r\n } else if (input.type === 'file') {\r\n values[name] = input.files;\r\n } else {\r\n values[name] = input.value;\r\n }\r\n });\r\n\r\n return values;\r\n }\r\n\r\n setValues(values) {\r\n Object.keys(values).forEach(key => {\r\n const input = this.form.querySelector(`[name=\"${key}\"]`);\r\n if (!input) return;\r\n\r\n if (input.type === 'checkbox') {\r\n const valuesArray = Array.isArray(values[key]) ? values[key] : [values[key]];\r\n input.checked = valuesArray.includes(input.value);\r\n } else if (input.type === 'radio') {\r\n const radio = this.form.querySelector(`[name=\"${key}\"][value=\"${values[key]}\"]`);\r\n if (radio) radio.checked = true;\r\n } else if (input.type === 'file') {\r\n const dataTransfer = new DataTransfer();\r\n if (values[key] instanceof FileList) {\r\n Array.from(values[key]).forEach(file => {\r\n dataTransfer.items.add(file);\r\n });\r\n }\r\n input.files = dataTransfer.files;\r\n } else {\r\n input.value = values[key];\r\n }\r\n });\r\n return this;\r\n }\r\n\r\n reset() {\r\n this.form.reset();\r\n this.errors = {};\r\n this.validator.resetForm(this.form);\r\n return this;\r\n }\r\n\r\n clearErrors() {\r\n this.errors = {};\r\n this.form.querySelectorAll('.ds-input--error').forEach(input => {\r\n this.validator.clearError(input);\r\n });\r\n return this;\r\n }\r\n\r\n getError(fieldName) {\r\n return this.errors[fieldName] || [];\r\n }\r\n\r\n hasError(fieldName) {\r\n return this.errors[fieldName] && this.errors[fieldName].length > 0;\r\n }\r\n\r\n destroy() {\r\n this.submitHandlers.forEach(handler => {\r\n this.form.removeEventListener('submit', handler);\r\n });\r\n this.submitHandlers = [];\r\n this.errors = {};\r\n this.rules = {};\r\n }\r\n }\r\n\r\n function useForm(formOrSelector, options = {}) {\r\n return new KupolaForm(formOrSelector, options);\r\n }\r\n\r\n function createForm(formOrSelector, options = {}) {\r\n return new KupolaForm(formOrSelector, options);\r\n }\r\n\r\n window.KupolaForm = KupolaForm;\r\n window.useForm = useForm;\r\n window.createForm = createForm;\r\n})(window);","class KupolaTestUtils {\r\n static createElement(html) {\r\n const container = document.createElement('div');\r\n container.innerHTML = html;\r\n return container.firstElementChild;\r\n }\r\n\r\n static mountComponent(ComponentClass, props = {}, html = '') {\r\n const element = this.createElement(html);\r\n const component = new ComponentClass(element);\r\n Object.assign(component.props, props);\r\n return { component, element };\r\n }\r\n\r\n static async waitFor(condition, timeout = 1000) {\r\n const startTime = Date.now();\r\n return new Promise((resolve, reject) => {\r\n const check = async () => {\r\n try {\r\n const result = await condition();\r\n if (result) {\r\n resolve(result);\r\n } else if (Date.now() - startTime < timeout) {\r\n requestAnimationFrame(check);\r\n } else {\r\n reject(new Error('waitFor timeout'));\r\n }\r\n } catch (error) {\r\n if (Date.now() - startTime < timeout) {\r\n requestAnimationFrame(check);\r\n } else {\r\n reject(new Error('waitFor timeout'));\r\n }\r\n }\r\n };\r\n requestAnimationFrame(check);\r\n });\r\n }\r\n\r\n static async waitForElement(selector, parent = document, timeout = 1000) {\r\n return this.waitFor(() => parent.querySelector(selector), timeout);\r\n }\r\n\r\n static async waitForText(text, parent = document, timeout = 1000) {\r\n return this.waitFor(() => parent.textContent.includes(text), timeout);\r\n }\r\n\r\n static fireEvent(element, eventName, detail = {}) {\r\n const event = new CustomEvent(eventName, { \r\n bubbles: true, \r\n cancelable: true, \r\n detail \r\n });\r\n element.dispatchEvent(event);\r\n }\r\n\r\n static fireInput(element, value) {\r\n element.value = value;\r\n this.fireEvent(element, 'input');\r\n this.fireEvent(element, 'change');\r\n }\r\n\r\n static fireClick(element) {\r\n this.fireEvent(element, 'click');\r\n }\r\n\r\n static fireKeyDown(element, key) {\r\n const event = new KeyboardEvent('keydown', { key, bubbles: true });\r\n element.dispatchEvent(event);\r\n }\r\n\r\n static async nextTick() {\r\n return new Promise(resolve => requestAnimationFrame(resolve));\r\n }\r\n\r\n static mockDate(date) {\r\n const originalNow = Date.now;\r\n const originalDate = Date;\r\n \r\n Date.now = () => date.getTime();\r\n globalThis.Date = class extends Date {\r\n constructor(...args) {\r\n super(...args);\r\n if (args.length === 0) {\r\n return new Date(date);\r\n }\r\n return new originalDate(...args);\r\n }\r\n };\r\n \r\n return () => {\r\n Date.now = originalNow;\r\n globalThis.Date = originalDate;\r\n };\r\n }\r\n\r\n static mockFetch(mockResponses) {\r\n const originalFetch = fetch;\r\n \r\n globalThis.fetch = jest.fn(async (url, options) => {\r\n for (const mock of mockResponses) {\r\n if (typeof mock.url === 'string' && url === mock.url) {\r\n return mock.response();\r\n }\r\n if (mock.url instanceof RegExp && mock.url.test(url)) {\r\n return mock.response();\r\n }\r\n if (mock.method && options && options.method === mock.method) {\r\n return mock.response();\r\n }\r\n }\r\n return originalFetch(url, options);\r\n });\r\n \r\n return () => {\r\n globalThis.fetch = originalFetch;\r\n };\r\n }\r\n\r\n static async mountAndWait(ComponentClass, props = {}, html = '') {\r\n const { component, element } = this.mountComponent(ComponentClass, props, html);\r\n await component.mount();\r\n await this.nextTick();\r\n return { component, element };\r\n }\r\n\r\n static async unmountAndWait(component) {\r\n await component.unmount();\r\n await this.nextTick();\r\n }\r\n\r\n static getByText(parent, text) {\r\n const elements = parent.querySelectorAll('*');\r\n for (const element of elements) {\r\n if (element.textContent.trim() === text) {\r\n return element;\r\n }\r\n }\r\n throw new Error(`Element with text \"${text}\" not found`);\r\n }\r\n\r\n static queryByText(parent, text) {\r\n const elements = parent.querySelectorAll('*');\r\n for (const element of elements) {\r\n if (element.textContent.trim() === text) {\r\n return element;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static getByTestId(parent, testId) {\r\n const element = parent.querySelector(`[data-testid=\"${testId}\"]`);\r\n if (!element) {\r\n throw new Error(`Element with data-testid=\"${testId}\" not found`);\r\n }\r\n return element;\r\n }\r\n\r\n static queryByTestId(parent, testId) {\r\n return parent.querySelector(`[data-testid=\"${testId}\"]`);\r\n }\r\n\r\n static getByRole(parent, role) {\r\n const element = parent.querySelector(`[role=\"${role}\"]`);\r\n if (!element) {\r\n throw new Error(`Element with role=\"${role}\" not found`);\r\n }\r\n return element;\r\n }\r\n\r\n static queryByRole(parent, role) {\r\n return parent.querySelector(`[role=\"${role}\"]`);\r\n }\r\n\r\n static async simulateDrag(element, startX, startY, endX, endY) {\r\n this.fireEvent(element, 'dragstart', {\r\n clientX: startX,\r\n clientY: startY\r\n });\r\n \r\n this.fireEvent(element, 'drag', {\r\n clientX: (startX + endX) / 2,\r\n clientY: (startY + endY) / 2\r\n });\r\n \r\n this.fireEvent(element, 'dragend', {\r\n clientX: endX,\r\n clientY: endY\r\n });\r\n }\r\n\r\n static async simulateTouch(element, startX, startY, endX, endY) {\r\n const touchStart = new TouchEvent('touchstart', {\r\n touches: [{ clientX: startX, clientY: startY }],\r\n bubbles: true\r\n });\r\n element.dispatchEvent(touchStart);\r\n \r\n const touchMove = new TouchEvent('touchmove', {\r\n touches: [{ clientX: (startX + endX) / 2, clientY: (startY + endY) / 2 }],\r\n bubbles: true\r\n });\r\n element.dispatchEvent(touchMove);\r\n \r\n const touchEnd = new TouchEvent('touchend', {\r\n touches: [{ clientX: endX, clientY: endY }],\r\n bubbles: true\r\n });\r\n element.dispatchEvent(touchEnd);\r\n }\r\n\r\n static async waitForState(component, stateKey, expectedValue) {\r\n return this.waitFor(() => {\r\n return component.state[stateKey] === expectedValue;\r\n });\r\n }\r\n\r\n static async waitForProps(component, propKey, expectedValue) {\r\n return this.waitFor(() => {\r\n return component.props[propKey] === expectedValue;\r\n });\r\n }\r\n\r\n static async waitForEmitted(component, eventName) {\r\n return this.waitFor(() => {\r\n return component._emitted && component._emitted[eventName];\r\n });\r\n }\r\n\r\n static spyOn(obj, methodName) {\r\n const original = obj[methodName];\r\n const spy = function(...args) {\r\n spy.called = true;\r\n spy.callCount = (spy.callCount || 0) + 1;\r\n spy.args = (spy.args || []).concat([args]);\r\n return original.apply(this, args);\r\n };\r\n obj[methodName] = spy;\r\n return () => {\r\n obj[methodName] = original;\r\n };\r\n }\r\n\r\n static async flushPromises() {\r\n return new Promise(resolve => setImmediate(resolve));\r\n }\r\n}\r\n\r\nwindow.KupolaTestUtils = KupolaTestUtils;\r\nwindow.testUtils = KupolaTestUtils;","class KupolaI18n {\r\n constructor(options = {}) {\r\n this.locales = options.locales || {};\r\n this.currentLocale = options.defaultLocale || 'zh-CN';\r\n this.fallbackLocale = options.fallbackLocale || 'zh-CN';\r\n this.delimiter = options.delimiter || '.';\r\n this.missingHandler = options.missingHandler || ((key) => {\r\n console.warn(`Missing translation: ${key}`);\r\n return key;\r\n });\r\n \r\n this._initFromDOM();\r\n }\r\n\r\n _initFromDOM() {\r\n const scriptTags = document.querySelectorAll('script[type=\"application/json\"][data-kupola-i18n]');\r\n scriptTags.forEach(script => {\r\n const locale = script.dataset.kupolaI18n;\r\n if (locale) {\r\n try {\r\n const data = JSON.parse(script.textContent);\r\n this.addLocale(locale, data);\r\n } catch (e) {\r\n console.error('Failed to parse i18n data:', e);\r\n }\r\n }\r\n });\r\n\r\n const htmlLang = document.documentElement.lang;\r\n if (htmlLang && this.locales[htmlLang]) {\r\n this.currentLocale = htmlLang;\r\n }\r\n }\r\n\r\n addLocale(locale, data) {\r\n if (!this.locales[locale]) {\r\n this.locales[locale] = {};\r\n }\r\n this._mergeDeep(this.locales[locale], data);\r\n }\r\n\r\n _mergeDeep(target, source) {\r\n for (const key of Object.keys(source)) {\r\n if (source[key] instanceof Object && key in target) {\r\n this._mergeDeep(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n\r\n setLocale(locale) {\r\n if (this.locales[locale]) {\r\n this.currentLocale = locale;\r\n document.documentElement.lang = locale;\r\n this._emitChange();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n getLocale() {\r\n return this.currentLocale;\r\n }\r\n\r\n t(key, params = {}) {\r\n let value = this._getTranslation(key, this.currentLocale);\r\n \r\n if (!value) {\r\n value = this._getTranslation(key, this.fallbackLocale);\r\n }\r\n \r\n if (!value) {\r\n return this.missingHandler(key);\r\n }\r\n \r\n return this._interpolate(value, params);\r\n }\r\n\r\n _getTranslation(key, locale) {\r\n if (!this.locales[locale]) return null;\r\n \r\n const keys = key.split(this.delimiter);\r\n let value = this.locales[locale];\r\n \r\n for (const k of keys) {\r\n if (value && typeof value === 'object' && k in value) {\r\n value = value[k];\r\n } else {\r\n return null;\r\n }\r\n }\r\n \r\n return typeof value === 'string' ? value : null;\r\n }\r\n\r\n _interpolate(str, params) {\r\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\r\n return params[key] !== undefined ? params[key] : match;\r\n });\r\n }\r\n\r\n n(key, count, params = {}) {\r\n const value = this.t(key, { ...params, count });\r\n \r\n if (!value) return value;\r\n \r\n const parts = value.split('|');\r\n \r\n if (parts.length === 1) {\r\n return value.replace('{count}', count);\r\n }\r\n \r\n if (parts.length === 2) {\r\n return count === 1 ? parts[0] : parts[1];\r\n }\r\n \r\n if (parts.length >= 3) {\r\n if (count === 0) return parts[0];\r\n if (count === 1) return parts[1];\r\n return parts[2];\r\n }\r\n \r\n return value;\r\n }\r\n\r\n _emitChange() {\r\n const event = new CustomEvent('kupola:i18n:change', {\r\n detail: { locale: this.currentLocale },\r\n bubbles: true\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n async loadLocale(locale, url) {\r\n try {\r\n const response = await fetch(url);\r\n const data = await response.json();\r\n this.addLocale(locale, data);\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to load locale:', error);\r\n return false;\r\n }\r\n }\r\n\r\n getAvailableLocales() {\r\n return Object.keys(this.locales);\r\n }\r\n\r\n hasLocale(locale) {\r\n return !!this.locales[locale];\r\n }\r\n\r\n formatDate(date, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n const dateObj = typeof date === 'string' ? new Date(date) : date;\r\n \r\n return new Intl.DateTimeFormat(locale, options).format(dateObj);\r\n }\r\n\r\n formatNumber(number, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, options).format(number);\r\n }\r\n\r\n formatCurrency(number, currency, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.NumberFormat(locale, {\r\n style: 'currency',\r\n currency,\r\n ...options\r\n }).format(number);\r\n }\r\n\r\n formatRelativeTime(value, unit, options = {}) {\r\n const locale = options.locale || this.currentLocale;\r\n \r\n return new Intl.RelativeTimeFormat(locale, options).format(value, unit);\r\n }\r\n}\r\n\r\nconst kupolaI18n = new KupolaI18n();\r\n\r\nfunction createI18n(options) {\r\n return new KupolaI18n(options);\r\n}\r\n\r\nfunction t(key, params = {}) {\r\n return kupolaI18n.t(key, params);\r\n}\r\n\r\nfunction n(key, count, params = {}) {\r\n return kupolaI18n.n(key, count, params);\r\n}\r\n\r\nfunction setLocale(locale) {\r\n return kupolaI18n.setLocale(locale);\r\n}\r\n\r\nfunction getLocale() {\r\n return kupolaI18n.getLocale();\r\n}\r\n\r\nfunction formatDate(date, options = {}) {\r\n return kupolaI18n.formatDate(date, options);\r\n}\r\n\r\nfunction formatNumber(number, options = {}) {\r\n return kupolaI18n.formatNumber(number, options);\r\n}\r\n\r\nfunction formatCurrency(number, currency, options = {}) {\r\n return kupolaI18n.formatCurrency(number, currency, options);\r\n}\r\n\r\nwindow.KupolaI18n = KupolaI18n;\r\nwindow.kupolaI18n = kupolaI18n;\r\nwindow.createI18n = createI18n;\r\nwindow.t = t;\r\nwindow.n = n;\r\nwindow.setLocale = setLocale;\r\nwindow.getLocale = getLocale;\r\nwindow.formatDate = formatDate;\r\nwindow.formatNumber = formatNumber;\r\nwindow.formatCurrency = formatCurrency;","class GlobalEventManager {\r\n constructor() {\r\n this.listeners = new Map();\r\n this.scopes = new Map();\r\n }\r\n\r\n on(target, eventType, handler, options = {}) {\r\n const key = this._getKey(target, eventType);\r\n \r\n if (!this.listeners.has(key)) {\r\n this.listeners.set(key, []);\r\n }\r\n \r\n const wrapper = (e) => {\r\n if (handler.before && typeof handler.before === 'function') {\r\n handler.before(e);\r\n }\r\n \r\n const result = handler(e);\r\n \r\n if (handler.after && typeof handler.after === 'function') {\r\n handler.after(e, result);\r\n }\r\n \r\n return result;\r\n };\r\n \r\n const listener = {\r\n handler,\r\n wrapper,\r\n options,\r\n active: true\r\n };\r\n \r\n this.listeners.get(key).push(listener);\r\n \r\n if (options.scope) {\r\n if (!this.scopes.has(options.scope)) {\r\n this.scopes.set(options.scope, []);\r\n }\r\n this.scopes.get(options.scope).push({ target, eventType, handler, wrapper });\r\n }\r\n \r\n target.addEventListener(eventType, wrapper, options);\r\n \r\n const unsubscribe = () => {\r\n target.removeEventListener(eventType, wrapper, options);\r\n if (this.listeners.has(key)) {\r\n const list = this.listeners.get(key);\r\n const idx = list.indexOf(listener);\r\n if (idx !== -1) {\r\n list.splice(idx, 1);\r\n }\r\n }\r\n if (options.scope && this.scopes.has(options.scope)) {\r\n const scopeList = this.scopes.get(options.scope);\r\n const idx = scopeList.findIndex(\r\n s => s.target === target && s.eventType === eventType && s.handler === handler\r\n );\r\n if (idx !== -1) {\r\n scopeList.splice(idx, 1);\r\n }\r\n }\r\n listener.active = false;\r\n };\r\n \r\n listener.unsubscribe = unsubscribe;\r\n \r\n return listener;\r\n }\r\n\r\n off(target, eventType, handler) {\r\n const key = this._getKey(target, eventType);\r\n \r\n if (!this.listeners.has(key)) return;\r\n \r\n const listenerList = this.listeners.get(key);\r\n const index = listenerList.findIndex(l => l.handler === handler);\r\n \r\n if (index !== -1) {\r\n const listener = listenerList[index];\r\n target.removeEventListener(eventType, listener.wrapper, listener.options);\r\n listener.active = false;\r\n listenerList.splice(index, 1);\r\n \r\n if (listener.options.scope) {\r\n this._removeFromScope(listener.options.scope, target, eventType, handler);\r\n }\r\n }\r\n }\r\n\r\n once(target, eventType, handler, options = {}) {\r\n const onceHandler = (e) => {\r\n this.off(target, eventType, onceHandler);\r\n return handler(e);\r\n };\r\n \r\n return this.on(target, eventType, onceHandler, options);\r\n }\r\n\r\n clearScope(scope) {\r\n if (!this.scopes.has(scope)) return;\r\n \r\n const scopeListeners = this.scopes.get(scope);\r\n \r\n scopeListeners.forEach(({ target, eventType, handler, wrapper }) => {\r\n target.removeEventListener(eventType, wrapper);\r\n \r\n const key = this._getKey(target, eventType);\r\n if (this.listeners.has(key)) {\r\n const listenerList = this.listeners.get(key);\r\n const index = listenerList.findIndex(l => l.handler === handler);\r\n if (index !== -1) {\r\n listenerList[index].active = false;\r\n listenerList.splice(index, 1);\r\n }\r\n }\r\n });\r\n \r\n this.scopes.delete(scope);\r\n }\r\n\r\n _removeFromScope(scope, target, eventType, handler) {\r\n if (!this.scopes.has(scope)) return;\r\n \r\n const scopeListeners = this.scopes.get(scope);\r\n const index = scopeListeners.findIndex(\r\n l => l.target === target && l.eventType === eventType && l.handler === handler\r\n );\r\n \r\n if (index !== -1) {\r\n scopeListeners.splice(index, 1);\r\n }\r\n }\r\n\r\n _getKey(target, eventType) {\r\n const targetName = target === document ? 'document' : \r\n target === window ? 'window' : \r\n target === document.body ? 'body' : \r\n target.nodeName ? target.nodeName : \r\n 'unknown';\r\n \r\n return `${targetName}:${eventType}`;\r\n }\r\n\r\n getListenerCount(target, eventType) {\r\n const key = this._getKey(target, eventType);\r\n return this.listeners.has(key) ? this.listeners.get(key).length : 0;\r\n }\r\n\r\n getAllListenerCounts() {\r\n const counts = {};\r\n this.listeners.forEach((listeners, key) => {\r\n counts[key] = listeners.filter(l => l.active).length;\r\n });\r\n return counts;\r\n }\r\n\r\n cleanup() {\r\n this.listeners.forEach((listenerList, key) => {\r\n const [targetName, eventType] = key.split(':');\r\n let target;\r\n \r\n if (targetName === 'document') target = document;\r\n else if (targetName === 'window') target = window;\r\n else if (targetName === 'body') target = document.body;\r\n \r\n if (target) {\r\n listenerList.forEach(listener => {\r\n target.removeEventListener(eventType, listener.wrapper, listener.options);\r\n });\r\n }\r\n });\r\n \r\n this.listeners.clear();\r\n this.scopes.clear();\r\n }\r\n}\r\n\r\nconst globalEvents = new GlobalEventManager();\r\n\r\nfunction on(target, eventType, handler, options) {\r\n return globalEvents.on(target, eventType, handler, options);\r\n}\r\n\r\nfunction off(target, eventType, handler) {\r\n globalEvents.off(target, eventType, handler);\r\n}\r\n\r\nfunction once(target, eventType, handler, options) {\r\n return globalEvents.once(target, eventType, handler, options);\r\n}\r\n\r\nfunction clearScope(scope) {\r\n globalEvents.clearScope(scope);\r\n}\r\n\r\nwindow.GlobalEventManager = GlobalEventManager;\r\nwindow.globalEvents = globalEvents;\r\nwindow.on = on;\r\nwindow.off = off;\r\nwindow.once = once;\r\nwindow.clearScope = clearScope;","class KupolaSecurity {\r\n constructor() {\r\n this.csrfToken = null;\r\n this.cspEnabled = false;\r\n }\r\n\r\n init() {\r\n this._initCSRF();\r\n this._initCSP();\r\n }\r\n\r\n _initCSRF() {\r\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\r\n if (metaTag) {\r\n this.csrfToken = metaTag.getAttribute('content');\r\n }\r\n }\r\n\r\n _initCSP() {\r\n const metaTag = document.querySelector('meta[http-equiv=\"Content-Security-Policy\"]');\r\n if (metaTag) {\r\n this.cspEnabled = true;\r\n }\r\n }\r\n\r\n getCSRFToken() {\r\n return this.csrfToken;\r\n }\r\n\r\n setCSRFToken(token) {\r\n this.csrfToken = token;\r\n const metaTag = document.querySelector('meta[name=\"csrf-token\"]');\r\n if (metaTag) {\r\n metaTag.setAttribute('content', token);\r\n }\r\n }\r\n\r\n addCSRFHeader(config) {\r\n if (this.csrfToken) {\r\n config.headers = config.headers || {};\r\n config.headers['X-CSRF-Token'] = this.csrfToken;\r\n }\r\n return config;\r\n }\r\n\r\n escapeHtml(str) {\r\n if (!str || typeof str !== 'string') return str;\r\n const div = document.createElement('div');\r\n div.textContent = str;\r\n return div.innerHTML;\r\n }\r\n\r\n sanitize(html) {\r\n if (!html || typeof html !== 'string') return html;\r\n\r\n const allowedTags = [\r\n 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'sub', 'sup',\r\n 'a', 'br', 'p', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\r\n 'ul', 'ol', 'li', 'table', 'thead', 'tbody', 'tr', 'td', 'th',\r\n 'img', 'video', 'audio', 'iframe'\r\n ];\r\n\r\n const allowedAttributes = [\r\n 'href', 'src', 'alt', 'title', 'class', 'id', 'data-*',\r\n 'width', 'height', 'frameborder', 'allowfullscreen'\r\n ];\r\n\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = html;\r\n\r\n const walk = (node) => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const tagName = node.tagName.toLowerCase();\r\n if (!allowedTags.includes(tagName)) {\r\n node.parentNode.replaceChild(document.createTextNode(node.textContent), node);\r\n return;\r\n }\r\n\r\n Array.from(node.attributes).forEach(attr => {\r\n const attrName = attr.name.toLowerCase();\r\n const isAllowed = allowedAttributes.includes(attrName) || \r\n attrName.startsWith('data-');\r\n \r\n if (!isAllowed) {\r\n node.removeAttribute(attr.name);\r\n } else if (attrName === 'href' || attrName === 'src') {\r\n if (!this._isSafeUrl(attr.value)) {\r\n node.removeAttribute(attr.name);\r\n }\r\n }\r\n });\r\n }\r\n\r\n for (let i = node.childNodes.length - 1; i >= 0; i--) {\r\n walk(node.childNodes[i]);\r\n }\r\n };\r\n\r\n walk(tempDiv);\r\n return tempDiv.innerHTML;\r\n }\r\n\r\n _isSafeUrl(url) {\r\n try {\r\n const parsed = new URL(url);\r\n const safeProtocols = ['http:', 'https:', 'data:', 'mailto:', 'tel:'];\r\n return safeProtocols.includes(parsed.protocol);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n validateEmail(email) {\r\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return re.test(email);\r\n }\r\n\r\n validateURL(url) {\r\n try {\r\n new URL(url);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n validatePhone(phone) {\r\n const re = /^[\\d\\s\\-\\+\\(\\)]{7,20}$/;\r\n return re.test(phone.replace(/\\s/g, ''));\r\n }\r\n\r\n generateSecureHash(str) {\r\n if (!str || typeof str !== 'string') return '';\r\n \r\n let hash = 0;\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return Math.abs(hash).toString(36);\r\n }\r\n\r\n isXSSAttack(str) {\r\n if (!str || typeof str !== 'string') return false;\r\n \r\n const xssPatterns = [\r\n /<script[^>]*>.*?<\\/script>/gi,\r\n /<img[^>]*onerror[^>]*>/gi,\r\n /javascript:/gi,\r\n /vbscript:/gi,\r\n /onload[^>]*=/gi,\r\n /onclick[^>]*=/gi,\r\n /onmouseover[^>]*=/gi,\r\n /<iframe[^>]*>/gi\r\n ];\r\n\r\n return xssPatterns.some(pattern => pattern.test(str));\r\n }\r\n\r\n protectForm(form) {\r\n if (!(form instanceof HTMLFormElement)) return;\r\n\r\n form.addEventListener('submit', (e) => {\r\n const inputs = form.querySelectorAll('input, textarea');\r\n let hasXSS = false;\r\n\r\n inputs.forEach(input => {\r\n if (this.isXSSAttack(input.value)) {\r\n hasXSS = true;\r\n input.classList.add('ds-input--error');\r\n } else {\r\n input.classList.remove('ds-input--error');\r\n }\r\n });\r\n\r\n if (hasXSS) {\r\n e.preventDefault();\r\n console.error('[KupolaSecurity] XSS attack detected in form');\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst kupolaSecurity = new KupolaSecurity();\r\nwindow.kupolaSecurity = kupolaSecurity;\r\nwindow.KupolaSecurity = KupolaSecurity;\r\n\r\nexport default KupolaSecurity;","class KupolaErrorHandler {\r\n constructor() {\r\n this.handlers = new Map();\r\n this.errorLog = [];\r\n this.maxLogs = 100;\r\n this.globalHandler = null;\r\n }\r\n\r\n init() {\r\n this._installGlobalHandlers();\r\n }\r\n\r\n _installGlobalHandlers() {\r\n window.addEventListener('error', (event) => {\r\n this.handleError(event.error || event.message, {\r\n source: event.filename,\r\n line: event.lineno,\r\n column: event.colno,\r\n type: 'global'\r\n });\r\n });\r\n\r\n window.addEventListener('unhandledrejection', (event) => {\r\n this.handleError(event.reason, {\r\n type: 'promise',\r\n rejection: true\r\n });\r\n });\r\n }\r\n\r\n setGlobalHandler(handler) {\r\n if (typeof handler === 'function') {\r\n this.globalHandler = handler;\r\n }\r\n }\r\n\r\n handleError(error, context = {}) {\r\n const errorInfo = this._normalizeError(error, context);\r\n \r\n this._logError(errorInfo);\r\n this._notifyHandlers(errorInfo);\r\n \r\n if (this.globalHandler) {\r\n try {\r\n this.globalHandler(errorInfo);\r\n } catch (e) {\r\n console.error('[KupolaErrorHandler] Error in global handler:', e);\r\n }\r\n }\r\n \r\n return errorInfo;\r\n }\r\n\r\n _normalizeError(error, context) {\r\n const errorInfo = {\r\n id: this._generateId(),\r\n timestamp: Date.now(),\r\n message: '',\r\n stack: '',\r\n type: context.type || 'unknown',\r\n source: context.source || '',\r\n line: context.line || 0,\r\n column: context.column || 0,\r\n component: context.component || '',\r\n hook: context.hook || '',\r\n args: context.args || [],\r\n ...context\r\n };\r\n\r\n if (error instanceof Error) {\r\n errorInfo.message = error.message;\r\n errorInfo.stack = error.stack || '';\r\n errorInfo.name = error.name;\r\n } else if (typeof error === 'string') {\r\n errorInfo.message = error;\r\n } else if (error && typeof error === 'object') {\r\n errorInfo.message = error.message || JSON.stringify(error);\r\n errorInfo.stack = error.stack || '';\r\n errorInfo.name = error.name || '';\r\n }\r\n\r\n return errorInfo;\r\n }\r\n\r\n _generateId() {\r\n return `err-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n _logError(errorInfo) {\r\n this.errorLog.unshift(errorInfo);\r\n if (this.errorLog.length > this.maxLogs) {\r\n this.errorLog.pop();\r\n }\r\n \r\n console.error(`[KupolaError] [${errorInfo.type}] ${errorInfo.message}`, errorInfo);\r\n }\r\n\r\n _notifyHandlers(errorInfo) {\r\n this.handlers.forEach((handler, key) => {\r\n try {\r\n handler(errorInfo);\r\n } catch (e) {\r\n console.error(`[KupolaErrorHandler] Error in handler \"${key}\":`, e);\r\n }\r\n });\r\n }\r\n\r\n on(type, handler) {\r\n if (!this.handlers.has(type)) {\r\n this.handlers.set(type, []);\r\n }\r\n this.handlers.get(type).push(handler);\r\n }\r\n\r\n off(type, handler) {\r\n if (!this.handlers.has(type)) return;\r\n \r\n const handlers = this.handlers.get(type);\r\n const index = handlers.indexOf(handler);\r\n if (index > -1) {\r\n handlers.splice(index, 1);\r\n }\r\n }\r\n\r\n getErrorLog() {\r\n return [...this.errorLog];\r\n }\r\n\r\n clearErrorLog() {\r\n this.errorLog = [];\r\n }\r\n\r\n getErrorCount() {\r\n return this.errorLog.length;\r\n }\r\n\r\n getErrorByType(type) {\r\n return this.errorLog.filter(err => err.type === type);\r\n }\r\n\r\n captureErrors(target, methodNames) {\r\n if (!target || !methodNames || !Array.isArray(methodNames)) return;\r\n\r\n methodNames.forEach(methodName => {\r\n if (typeof target[methodName] === 'function') {\r\n const originalMethod = target[methodName];\r\n target[methodName] = function(...args) {\r\n try {\r\n const result = originalMethod.apply(this, args);\r\n if (result instanceof Promise) {\r\n return result.catch(error => {\r\n kupolaErrorHandler.handleError(error, {\r\n type: 'method',\r\n component: target.constructor?.name || '',\r\n hook: methodName,\r\n args\r\n });\r\n throw error;\r\n });\r\n }\r\n return result;\r\n } catch (error) {\r\n kupolaErrorHandler.handleError(error, {\r\n type: 'method',\r\n component: target.constructor?.name || '',\r\n hook: methodName,\r\n args\r\n });\r\n throw error;\r\n }\r\n };\r\n }\r\n });\r\n }\r\n}\r\n\r\nconst kupolaErrorHandler = new KupolaErrorHandler();\r\nwindow.kupolaErrorHandler = kupolaErrorHandler;\r\nwindow.KupolaErrorHandler = KupolaErrorHandler;\r\n\r\nexport default KupolaErrorHandler;","class KupolaPerformance {\r\n constructor() {\r\n this.metrics = new Map();\r\n this.timers = new Map();\r\n this.observers = [];\r\n this.enabled = false;\r\n this.thresholds = {\r\n render: 16,\r\n mount: 100,\r\n update: 50,\r\n http: 3000\r\n };\r\n }\r\n\r\n init() {\r\n this.enabled = true;\r\n this._setupObservers();\r\n this._measureNavigation();\r\n }\r\n\r\n _setupObservers() {\r\n if ('PerformanceObserver' in window) {\r\n const paintObserver = new PerformanceObserver((entryList) => {\r\n entryList.getEntries().forEach(entry => {\r\n this._recordMetric('paint', {\r\n name: entry.name,\r\n startTime: entry.startTime,\r\n duration: entry.duration\r\n });\r\n });\r\n });\r\n paintObserver.observe({ type: 'paint', buffered: true });\r\n this.observers.push(paintObserver);\r\n\r\n const resourceObserver = new PerformanceObserver((entryList) => {\r\n entryList.getEntries().forEach(entry => {\r\n this._recordMetric('resource', {\r\n name: entry.name,\r\n type: entry.initiatorType,\r\n duration: entry.duration,\r\n size: entry.transferSize,\r\n startTime: entry.startTime\r\n });\r\n });\r\n });\r\n resourceObserver.observe({ type: 'resource', buffered: true });\r\n this.observers.push(resourceObserver);\r\n\r\n const longTaskObserver = new PerformanceObserver((entryList) => {\r\n entryList.getEntries().forEach(entry => {\r\n this._recordMetric('longtask', {\r\n duration: entry.duration,\r\n startTime: entry.startTime\r\n });\r\n });\r\n });\r\n longTaskObserver.observe({ type: 'longtask', buffered: true });\r\n this.observers.push(longTaskObserver);\r\n }\r\n }\r\n\r\n _measureNavigation() {\r\n if ('performance' in window) {\r\n const nav = performance.getEntriesByType('navigation')[0];\r\n if (nav) {\r\n this._recordMetric('navigation', {\r\n domContentLoaded: nav.domContentLoadedEventEnd - nav.fetchStart,\r\n load: nav.loadEventEnd - nav.fetchStart,\r\n firstByte: nav.responseStart - nav.requestStart,\r\n redirectCount: nav.redirectCount\r\n });\r\n }\r\n }\r\n }\r\n\r\n startTimer(name, context = {}) {\r\n if (!this.enabled) return;\r\n \r\n this.timers.set(name, {\r\n startTime: performance.now(),\r\n context\r\n });\r\n }\r\n\r\n stopTimer(name) {\r\n if (!this.enabled) return null;\r\n \r\n const timer = this.timers.get(name);\r\n if (!timer) return null;\r\n \r\n const duration = performance.now() - timer.startTime;\r\n this.timers.delete(name);\r\n \r\n this._recordMetric('timer', {\r\n name,\r\n duration,\r\n ...timer.context\r\n });\r\n\r\n return duration;\r\n }\r\n\r\n _recordMetric(type, data) {\r\n if (!this.enabled) return;\r\n \r\n const metric = {\r\n type,\r\n timestamp: Date.now(),\r\n ...data\r\n };\r\n \r\n if (!this.metrics.has(type)) {\r\n this.metrics.set(type, []);\r\n }\r\n this.metrics.get(type).push(metric);\r\n }\r\n\r\n measure(fn, name, context = {}) {\r\n if (!this.enabled) return fn();\r\n \r\n this.startTimer(name, context);\r\n \r\n let result;\r\n let error;\r\n \r\n try {\r\n result = fn();\r\n } catch (e) {\r\n error = e;\r\n }\r\n \r\n const duration = this.stopTimer(name);\r\n \r\n if (error) {\r\n throw error;\r\n }\r\n \r\n return result;\r\n }\r\n\r\n measureAsync(fn, name, context = {}) {\r\n if (!this.enabled) return fn();\r\n \r\n this.startTimer(name, context);\r\n \r\n return fn().then(result => {\r\n this.stopTimer(name);\r\n return result;\r\n }).catch(error => {\r\n this.stopTimer(name);\r\n throw error;\r\n });\r\n }\r\n\r\n getMetrics(type) {\r\n if (type) {\r\n return this.metrics.get(type) || [];\r\n }\r\n return Array.from(this.metrics.entries());\r\n }\r\n\r\n getSummary() {\r\n const summary = {\r\n navigation: null,\r\n paint: null,\r\n timers: [],\r\n resources: [],\r\n longTasks: []\r\n };\r\n\r\n if (this.metrics.has('navigation')) {\r\n summary.navigation = this.metrics.get('navigation')[0];\r\n }\r\n \r\n if (this.metrics.has('paint')) {\r\n summary.paint = this.metrics.get('paint');\r\n }\r\n \r\n if (this.metrics.has('timer')) {\r\n summary.timers = this.metrics.get('timer');\r\n }\r\n \r\n if (this.metrics.has('resource')) {\r\n summary.resources = this.metrics.get('resource');\r\n }\r\n \r\n if (this.metrics.has('longtask')) {\r\n summary.longTasks = this.metrics.get('longtask');\r\n }\r\n\r\n return summary;\r\n }\r\n\r\n getPerformanceScore() {\r\n const summary = this.getSummary();\r\n let score = 100;\r\n \r\n if (summary.navigation) {\r\n if (summary.navigation.load > 3000) score -= 20;\r\n else if (summary.navigation.load > 2000) score -= 10;\r\n \r\n if (summary.navigation.domContentLoaded > 1500) score -= 15;\r\n else if (summary.navigation.domContentLoaded > 1000) score -= 5;\r\n }\r\n \r\n if (summary.paint) {\r\n const fcp = summary.paint.find(p => p.name === 'first-contentful-paint');\r\n if (fcp && fcp.startTime > 2000) score -= 20;\r\n else if (fcp && fcp.startTime > 1000) score -= 10;\r\n }\r\n \r\n if (summary.longTasks.length > 0) {\r\n score -= summary.longTasks.length * 10;\r\n }\r\n \r\n return Math.max(0, score);\r\n }\r\n\r\n logSummary() {\r\n const summary = this.getSummary();\r\n const score = this.getPerformanceScore();\r\n \r\n console.group('[KupolaPerformance] Summary');\r\n console.log('Score:', score);\r\n console.log('Navigation:', summary.navigation);\r\n console.log('Paint:', summary.paint);\r\n console.log('Long Tasks:', summary.longTasks.length);\r\n console.groupEnd();\r\n }\r\n\r\n clear() {\r\n this.metrics.clear();\r\n this.timers.clear();\r\n }\r\n\r\n destroy() {\r\n this.observers.forEach(observer => {\r\n observer.disconnect();\r\n });\r\n this.observers = [];\r\n this.clear();\r\n this.enabled = false;\r\n }\r\n}\r\n\r\nconst kupolaPerformance = new KupolaPerformance();\r\nwindow.kupolaPerformance = kupolaPerformance;\r\nwindow.KupolaPerformance = KupolaPerformance;\r\n\r\nexport default KupolaPerformance;","import '../js/component.js';\r\nimport '../js/registry.js';\r\nimport '../js/router.js';\r\nimport '../js/http.js';\r\nimport '../js/initializer.js';\r\nimport '../js/kupola-core.js';\r\nimport '../js/kupola-lifecycle.js';\r\nimport '../js/utils.js';\r\nimport '../js/data-bind.js';\r\nimport '../js/theme.js';\r\nimport '../js/dropdown.js';\r\nimport '../js/select.js';\r\nimport '../js/datepicker.js';\r\nimport '../js/timepicker.js';\r\nimport '../js/slider.js';\r\nimport '../js/carousel.js';\r\nimport '../js/drawer.js';\r\nimport '../js/modal.js';\r\nimport '../js/dialog.js';\r\nimport '../js/notification.js';\r\nimport '../js/message.js';\r\nimport '../js/fileupload.js';\r\nimport '../js/collapse.js';\r\nimport '../js/color-picker.js';\r\nimport '../js/calendar.js';\r\nimport '../js/dynamic-tags.js';\r\nimport '../js/image-preview.js';\r\nimport '../js/tag.js';\r\nimport '../js/statcard.js';\r\nimport '../js/heatmap.js';\r\nimport '../js/tooltip.js';\r\nimport '../js/validation.js';\r\nimport '../js/virtual-list.js';\r\nimport '../js/kupola-devtools.js';\r\nimport '../js/icons.js';\r\nimport '../js/countdown.js';\r\nimport '../js/numberinput.js';\r\nimport '../js/slide-captcha.js';\r\nimport '../js/composition-api.js';\r\nimport '../js/form.js';\r\nimport '../js/test-utils.js';\r\nimport '../js/i18n.js';\r\nimport '../js/global-events.js';\r\nimport '../js/security.js';\r\nimport '../js/error-handler.js';\r\nimport '../js/performance.js';\r\n\r\nexport const KupolaComponent = window.KupolaComponent;\r\nexport const KupolaComponentRegistry = window.KupolaComponentRegistry;\r\nexport const KupolaRouter = window.KupolaRouter;\r\nexport const KupolaHttp = window.KupolaHttp;\r\nexport const KupolaStatePersist = window.KupolaStatePersist;\r\nexport const KupolaLifecycle = window.KupolaLifecycle;\r\nexport const KupolaPluginManager = window.KupolaPluginManager;\r\nexport const KupolaDevTools = window.KupolaDevTools;\r\n\r\nexport const kupolaRegistry = window.kupolaRegistry;\r\nexport const kupolaPersist = window.kupolaPersist;\r\nexport const kupolaLifecycle = window.kupolaLifecycle;\r\nexport const kupolaPluginManager = window.kupolaPluginManager;\r\nexport const KupolaUtils = window.KupolaUtils;\r\n\r\nexport const createRouter = window.createRouter;\r\nexport const createHttp = window.createHttp;\r\nexport const createLifecycle = window.createLifecycle;\r\nexport const createStore = window.createStore;\r\nexport const getStore = window.getStore;\r\nexport const registerComponent = window.registerComponent;\r\nexport const registerLazyComponent = window.registerLazyComponent;\r\nexport const bootstrapComponents = window.bootstrapComponents;\r\nexport const defineMixin = window.defineMixin;\r\nexport const useMixin = window.useMixin;\r\n\r\nexport const initTheme = window.initTheme;\r\nexport const setTheme = window.setTheme;\r\nexport const getTheme = window.getTheme;\r\nexport const setBrand = window.setBrand;\r\nexport const getBrand = window.getBrand;\r\n\r\nexport const initDropdowns = window.initDropdowns;\r\nexport const initSelects = window.initSelects;\r\nexport const initDatePickers = window.initDatePickers;\r\nexport const initTimePickers = window.initTimePickers;\r\nexport const initSliders = window.initSliders;\r\nexport const initCarousels = window.initCarousels;\r\nexport const initDrawers = window.initDrawers;\r\nexport const initModals = window.initModals;\r\nexport const initDialogs = window.initDialogs;\r\nexport const initNotifications = window.initNotifications;\r\nexport const initMessages = window.initMessages;\r\nexport const initFileUploads = window.initFileUploads;\r\nexport const initCollapses = window.initCollapses;\r\nexport const initColorPickers = window.initColorPickers;\r\nexport const initCalendars = window.initCalendars;\r\nexport const initDynamicTags = window.initDynamicTags;\r\nexport const initImagePreviews = window.initImagePreviews;\r\nexport const initTags = window.initTags;\r\nexport const initStatCards = window.initStatCards;\r\nexport const initHeatmaps = window.initHeatmaps;\r\nexport const initTooltips = window.initTooltips;\r\nexport const initValidation = window.initValidation;\r\nexport const initVirtualLists = window.initVirtualLists;\r\nexport const initIcons = window.initIcons;\r\nexport const initCountdowns = window.initCountdowns;\r\nexport const initNumberInputs = window.initNumberInputs;\r\nexport const initSlideCaptchas = window.initSlideCaptchas;\r\n\r\nexport const setup = window.setup;\r\nexport const ref = window.ref;\r\nexport const reactive = window.reactive;\r\nexport const onMounted = window.onMounted;\r\nexport const onUnmounted = window.onUnmounted;\r\nexport const onUpdated = window.onUpdated;\r\nexport const watch = window.watch;\r\nexport const computed = window.computed;\r\n\r\nexport const KupolaForm = window.KupolaForm;\r\nexport const useForm = window.useForm;\r\nexport const createForm = window.createForm;\r\n\r\nexport const KupolaTestUtils = window.KupolaTestUtils;\r\nexport const testUtils = window.testUtils;\r\n\r\nexport const KupolaI18n = window.KupolaI18n;\r\nexport const kupolaI18n = window.kupolaI18n;\r\nexport const createI18n = window.createI18n;\r\nexport const t = window.t;\r\nexport const n = window.n;\r\nexport const setLocale = window.setLocale;\r\nexport const getLocale = window.getLocale;\r\nexport const formatDate = window.formatDate;\r\nexport const formatNumber = window.formatNumber;\r\nexport const formatCurrency = window.formatCurrency;\r\n\r\nexport const GlobalEventManager = window.GlobalEventManager;\r\nexport const globalEvents = window.globalEvents;\r\nexport const on = window.on;\r\nexport const off = window.off;\r\nexport const once = window.once;\r\nexport const clearScope = window.clearScope;\r\n\r\nexport const KupolaSecurity = window.KupolaSecurity;\r\nexport const kupolaSecurity = window.kupolaSecurity;\r\n\r\nexport const KupolaErrorHandler = window.KupolaErrorHandler;\r\nexport const kupolaErrorHandler = window.kupolaErrorHandler;\r\n\r\nexport const KupolaPerformance = window.KupolaPerformance;\r\nexport const kupolaPerformance = window.kupolaPerformance;\r\n\r\nexport default {\r\n KupolaComponent,\r\n KupolaComponentRegistry,\r\n KupolaRouter,\r\n KupolaHttp,\r\n KupolaStatePersist,\r\n KupolaLifecycle,\r\n KupolaPluginManager,\r\n KupolaDevTools,\r\n KupolaSecurity,\r\n KupolaErrorHandler,\r\n KupolaPerformance,\r\n kupolaRegistry,\r\n kupolaPersist,\r\n kupolaLifecycle,\r\n kupolaPluginManager,\r\n kupolaSecurity,\r\n kupolaErrorHandler,\r\n kupolaPerformance,\r\n KupolaUtils,\r\n createRouter,\r\n createHttp,\r\n createLifecycle,\r\n createStore,\r\n getStore,\r\n registerComponent,\r\n registerLazyComponent,\r\n bootstrapComponents,\r\n defineMixin,\r\n useMixin,\r\n initTheme,\r\n setTheme,\r\n getTheme,\r\n setBrand,\r\n getBrand,\r\n initDropdowns,\r\n initSelects,\r\n initDatePickers,\r\n initTimePickers,\r\n initSliders,\r\n initCarousels,\r\n initDrawers,\r\n initModals,\r\n initDialogs,\r\n initNotifications,\r\n initMessages,\r\n initFileUploads,\r\n initCollapses,\r\n initColorPickers,\r\n initCalendars,\r\n initDynamicTags,\r\n initImagePreviews,\r\n initTags,\r\n initStatCards,\r\n initHeatmaps,\r\n initTooltips,\r\n initValidation,\r\n initVirtualLists,\r\n initIcons,\r\n initCountdowns,\r\n initNumberInputs,\r\n initSlideCaptchas,\r\n setup,\r\n ref,\r\n reactive,\r\n onMounted,\r\n onUnmounted,\r\n onUpdated,\r\n watch,\r\n computed,\r\n KupolaForm,\r\n useForm,\r\n createForm,\r\n KupolaTestUtils,\r\n testUtils,\r\n KupolaI18n,\r\n kupolaI18n,\r\n createI18n,\r\n t,\r\n n,\r\n setLocale,\r\n getLocale,\r\n formatDate,\r\n formatNumber,\r\n formatCurrency,\r\n GlobalEventManager,\r\n globalEvents,\r\n on,\r\n off,\r\n once,\r\n clearScope\r\n};"],"names":["KupolaComponent","element","props","attr","name","value","slots","slotEl","slotName","eventName","data","handler","e","customEvent","cb","newProps","error","newState","result","hookMap","proto","registeredHooks","methodName","lifecyclePhase","phase","errorInfo","applyMixin","componentClass","mixin","key","original","args","module","KupolaComponentRegistry","loader","cached","loadingPromise","mixinNames","root","elements","promises","componentName","initializer","ComponentClass","instance","mutations","mutation","node","child","childInstance","KupolaRouter","options","routes","parentPath","route","fullPath","pathRegex","path","regexStr","replace","from","match","params","index","query","search","pair","url","container","componentElement","parentRoute","rootContainer","parentName","parentElement","component","cacheKey","delta","resolve","transitionDuration","cleanup","style","animationDuration","createRouter","KupolaHttp","config","method","dataKey","retryCount","headers","timeout","cache","controller","requestHeaders","requestConfig","urlObj","intercepted","response","axiosConfig","signal","timeoutPromise","_","reject","timerId","fetchPromise","contentType","useCache","useRetry","file","chunkSize","onProgress","parallel","totalChunks","uploadedChunks","progress","fileId","i","promise","chunkIndex","start","end","chunk","formData","fileName","hash","token","type","ttl","retries","createHttp","ComponentInitializerRegistry","initFn","cleanupFn","dataAttrs","className","classSelectors","selector","classNamePart","kupolaInitializer","require$$0","require$$1","require$$2","require$$3","kupolaCoreModule","kupolaBootstrap","KupolaLifecycle$1","scope","nextState","allowed","handlers","hook","hooks","a","b","h","depends","depName","depHook","emitId","startTime","hookStartTime","hookResult","hookError","hookDuration","totalDuration","stateMap","beforePhase","afterPhase","onReady","targetState","boundary","max","boundaryHandlers","KupolaPluginManager$1","plugin","KupolaLifecycle","pluginName","pluginHooks","unsubscribe","kupolaLifecycle","kupolaPluginManager","KupolaPluginManager","createLifecycle","KupolaUtils","str","c","length","padChar","maxLength","suffix","replacement","template","prefix","times","div","chars","r","arr","defaultValue","arg","separator","item","fromIndex","items","compareFn","order","valA","valB","predicate","fn","initialValue","depth","acc","seen","size","chunks","j","val","arr1","arr2","obj","current","keys","lastKey","map","set","clone","keyField","valueField","obj1","obj2","keys1","keys2","min","precision","factor","nums","decimals","currency","radix","num","now","date","formatStr","year","month","day","hours","minutes","seconds","milliseconds","weekDay","days","newDate","date1","date2","d1","d2","startOfYear","diff","startDay","birthDate","age","minute","hour","week","func","wait","lastArgs","lastThis","lastCallTime","leading","trailing","invokeFunc","leadingEdge","trailingEdge","remainingWait","timeSinceLastCall","limit","inThrottle","regex","cleanStr","sum","alternate","digit","g","len","str1","str2","substring","rules","errors","fieldRules","fieldErrors","rule","message","md5Array","K","S","leftRotate","shift","addPadding","bitLength","lowBytes","highBytes","processBlock","block","state","d","words","AA","BB","CC","DD","f","round","wordIndex","temp","paddedMessage","word","rightRotate","s0","s1","S1","ch","temp1","S0","maj","temp2","bytes","byte1","byte2","byte3","enc1","enc2","enc3","enc4","crossOrigin","img","urls","results","async","defer","script","media","link","fontFamily","src","weight","fontFace","TrieNode","PathTrie","parts","part","collectKeys","n","REACTIVE_SYMBOLS","KupolaDataBind","target","receiver","oldValue","parentKey","proxy","updatedKeys","subKey","subValue","dep","k","silent","parent","callback","binding","display","deps","prop","values","storageType","debounce","version","encrypt","encryptionKey","storage","newValue","dataToStore","serialized","e2","testKey","maxAge","text","ciphertext","persisted","stored","parsed","decrypted","snapshot","snapshotIndex","formElement","existingHandler","KupolaStore","initialState","payload","action","KupolaStoreManager","store","KupolaEventBus","onceCallback","listener","sel","kupolaData","kupolaEvents","kupolaStoreManager","createStore","getStore","THEME_KEY","BRAND_KEY","BRAND_OPTIONS","getTheme","setTheme","theme","toggleBtn","icon","iconPath","getBrand","setBrand","brandId","brand","brandToggle","brandIcon","brandName","btn","initTheme","savedTheme","savedBrand","newTheme","brandPicker","isHidden","closeBrandPicker","createThemeToggle","scripts","currentScript","scriptPath","createBrandPicker","closeBrandPickerAuto","loadDevTools","urlParams","themeScript","devToolsScript","runInit","readyStateHandler","Dropdown","isOpen","initDropdown","dropdown","cleanupDropdown","Select","option","initSelect","select","cleanupSelect","Datepicker","pickerRect","calendarRect","spaceBelow","spaceAbove","calendarHeight","isVisible","calendar","input","titleEl","daysEl","prevBtn","nextBtn","currentDate","renderCalendar","dayEl","firstDay","daysInMonth","emptyDay","dateStr","today","todayStr","dayClickHandler","prevClickHandler","nextClickHandler","initDatepicker","picker","cleanupDatepicker","Timepicker","panelRect","panelHeight","timeParts","displayHour","displayMinute","updateDisplay","updateInput","selectTimeAndClose","hourGrid","minuteGrid","initTimepicker","cleanupTimepicker","Slider","percentage","el","event","initSlider","slider","cleanupSlider","Carousel","indicator","offset","newIndex","initCarousel","carousel","initCarousels","cleanupCarousel","Drawer","closeBtn","cancelBtn","confirmBtn","initDrawer","drawer","cleanupDrawer","Modal","createModal","title","content","width","onConfirm","onCancel","modal","bodyEl","confirmHandler","cancelHandler","closeAndDestroy","originalClose","initModal","cleanupModal","initModals","Dialog","icons","mask","keydownHandler","close","maskClickHandler","confirmClickHandler","cancelClickHandler","FileUpload","clickHandler","changeHandler","files","dragoverHandler","dragleaveHandler","dropHandler","accept","types","t","fileType","fileIcon","removeBtn","removeHandler","extension","sizes","itemElement","errorElement","reader","previewItem","previewRemoveBtn","previewRemoveHandler","percent","bar","currentChunk","uploadInterval","initFileUpload","cleanupFileUpload","initFileUploads","Collapse","header","isActive","transitionHandler","headerInfo","initCollapse","collapse","cleanupCollapse","initCollapses","ColorPicker","color","colorBtn","initColorPicker","cleanupColorPicker","Calendar","prevHandler","nextHandler","todayHandler","dayStr","initCalendar","cleanupCalendar","initCalendars","DynamicTags","tag","addTag","textNode","tagRemoveHandler","tags","initDynamicTags","cleanupDynamicTags","initDynamicTagsAll","ImagePreview","images","meta","indicators","currentImage","imagePreviewInstance","initImagePreview","trigger","showImagePreview","Tag","closeHandler","textNodes","initTag","cleanupTag","initTags","StatCard","entries","entry","targetValue","duration","startValue","animate","currentTime","elapsed","easeProgress","currentValue","formattedValue","currentWidth","targetWidth","currentWidthValue","direction","trendElement","iconSvg","initStatCard","cleanupStatCard","initStatCards","card","updateStatCard","Heatmap","maxValue","ratio","hex","level","rgb","opacity","months","currentMonth","weeks","firstDayOfWeek","body","currentWeek","weekCount","cellWidth","totalGridWidth","labelsAndGrid","weekdayLabels","weekdayLabelHeight","label","gridContainer","monthLabels","monthInfo","nextMonth","weekSpan","grid","weekColumn","emptyCell","cell","mouseenterHandler","mouseleaveHandler","legend","cells","label2","rect","tooltipWidth","startDate","endDate","initHeatmap","dataAttr","generateMockHeatmapData","info","cleanupHeatmap","initHeatmaps","oneYearAgo","baseValue","createHeatmap","Tooltip","position","tooltipRect","viewportWidth","viewportHeight","left","top","initTooltip","tooltip","cleanupTooltip","KupolaValidator","form","formId","inputs","hasError","valueEl","uploadInstance","forms","allValid","group","formErrors","asyncRules","validatorFunc","groupName","groups","statusElement","loading","submitting","disabled","rulesString","pattern","targetId","customMessage","validator","hasAsyncValidation","isValid","submitBtn","originalText","onSubmit","firstError","activeElement","validateOnInput","this","VirtualList","isHorizontal","scrollOffset","positions","currentPosition","total","itemSize","viewportSize","startIndex","endIndex","visibleData","html","actualIndex","isSelected","hasChanges","actualHeight","dataItem","totalSize","thumbHeight","maxTop","thumbTop","totalHeight","deltaY","newTop","scrollTop","behavior","generateMockVirtualListData","count","titles","titleIndex","randomNum","createVirtualList","initVirtualList","cleanupVirtualList","initVirtualLists","KupolaDevTools$1","button","panel","tab","tabName","storageSubTabs","networkSubTabs","req","statusClass","details","clearBtn","devTools","originalFetch","requestId","requestBody","originalOpen","originalSend","originalOnReadyStateChange","responseText","originalSetItem","originalRemoveItem","styles","isDragging","startX","startY","startLeft","startTop","dx","dy","valueParts","displayValue","initDevTools","KupolaDevTools","global","ATTRS","PATHS","svg","viewBox","render","vb","Countdown","dataEndTime","dataHours","dataMinutes","dataSeconds","distance","initCountdown","cleanupCountdown","initCountdowns","NumberInput","minusHandler","plusHandler","inputHandler","initNumberInput","cleanupNumberInput","initNumberInputs","SlideCaptcha","trackWidth","btnWidth","maxOffset","deltaX","btnOffset","mid","distractor","clientX","clientY","velocity","acceleration","last","dt","prev","prevDt","prevV","pointCountEl","finalX","distractorDiff","targetDiff","speeds","maxSpeed","minSpeed","hasYMovement","p","totalTime","accelerations","onVerified","initSlideCaptchas","captcha","cleanupSlideCaptcha","cleanupAllSlideCaptchas","window","currentSetupContext","SetupContext","refObj","sub","self","source","watcher","trackedPaths","originalGet","getter","update","computedValue","paths","ref","reactive","onMounted","onUnmounted","onUpdated","watch","computed","setup","setupFn","setupContext","prevContext","ctx","KupolaForm","formOrSelector","wrappedHandler","validation","ruleString","fields","allErrors","asyncResult","displayName","valuesArray","radio","dataTransfer","fieldName","useForm","createForm","KupolaTestUtils$1","condition","check","detail","originalNow","originalDate","mockResponses","mock","testId","role","endX","endY","touchStart","touchMove","touchEnd","stateKey","expectedValue","propKey","spy","KupolaTestUtils","KupolaI18n$1","locale","htmlLang","dateObj","number","unit","kupolaI18n","KupolaI18n","createI18n","setLocale","getLocale","formatDate","formatNumber","formatCurrency","GlobalEventManager$1","eventType","wrapper","list","idx","scopeList","s","listenerList","l","onceHandler","scopeListeners","counts","listeners","targetName","globalEvents","GlobalEventManager","on","off","once","clearScope","KupolaSecurity$1","metaTag","allowedTags","allowedAttributes","tempDiv","walk","tagName","attrName","email","phone","char","hasXSS","kupolaSecurity","KupolaSecurity","KupolaErrorHandler$1","context","err","methodNames","originalMethod","kupolaErrorHandler","KupolaErrorHandler","KupolaPerformance$1","paintObserver","entryList","resourceObserver","longTaskObserver","nav","timer","metric","summary","score","fcp","observer","kupolaPerformance","KupolaPerformance","KupolaStatePersist","kupolaRegistry","kupolaPersist","registerComponent","registerLazyComponent","bootstrapComponents","defineMixin","useMixin","initDropdowns","initSelects","initDatePickers","initTimePickers","initSliders","initDrawers","initDialogs","initNotifications","initMessages","initColorPickers","initImagePreviews","initTooltips","initValidation","initIcons","testUtils"],"mappings":"+RAAA,MAAMA,CAAgB,CACpB,YAAYC,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,UAAY,GACjB,KAAK,YAAc,GACnB,KAAK,MAAQ,KAAK,cAClB,KAAK,MAAQ,GACb,KAAK,MAAQ,KAAK,cAClB,KAAK,gBAAkB,GACvB,KAAK,eAAiB,GACtB,KAAK,UAAY,OAAO,gBACpB,IAAI,OAAO,gBACX,CACE,GAAI,IAAM,IAAM,CAAA,EAChB,KAAM,IAAM,CAAA,EACZ,UAAW,IAAM,CAAA,EACjB,MAAO,IAAM,CAAA,EACb,OAAQ,IAAM,CAAA,EACd,QAAS,IAAM,CAAA,EACf,QAAS,IAAM,CAAA,EACf,MAAO,SACjB,EACI,KAAK,aAAe,IACxB,CAEE,aAAc,CACZ,MAAMC,EAAQ,CAAA,EACd,UAAWC,KAAQ,KAAK,QAAQ,WAC9B,GAAIA,EAAK,KAAK,WAAW,YAAY,EAAG,CACtC,MAAMC,EAAOD,EAAK,KAAK,QAAQ,aAAc,EAAE,EAC/C,IAAIE,EAAQF,EAAK,MACjB,GAAI,CACFE,EAAQ,KAAK,MAAMA,CAAK,CAClC,MAAoB,CAAA,CACZH,EAAME,CAAI,EAAIC,CACtB,CAEI,OAAOH,CACX,CAEE,aAAc,CACZ,MAAMI,EAAQ,CAAA,EAGd,OAFqB,KAAK,QAAQ,iBAAiB,aAAa,EAEnD,QAAQC,GAAU,CAC7B,MAAMC,EAAWD,EAAO,aAAa,WAAW,GAAK,UACrDD,EAAME,CAAQ,EAAID,EAAO,UAAU,KAAI,EACvCA,EAAO,OAAM,CACnB,CAAK,EAEG,CAACD,EAAM,SAAW,KAAK,QAAQ,SAAS,OAAS,IACnDA,EAAM,QAAU,KAAK,QAAQ,UAAU,KAAI,GAGtCA,CACX,CAEE,MAAMF,EAAO,UAAW,CACtB,OAAO,KAAK,MAAMA,CAAI,GAAK,EAC/B,CAEE,MAAMK,EAAWC,EAAM,CAUrB,IATiB,KAAK,gBAAgBD,CAAS,GAAK,CAAA,GAC3C,QAAQE,GAAW,CAC1B,GAAI,CACFA,EAAQD,CAAI,CACpB,OAAeE,EAAG,CACV,QAAQ,MAAM,8BAA8BH,CAAS,IAAKG,CAAC,CACnE,CACA,CAAK,EAEG,KAAK,QAAS,CAChB,MAAMC,EAAc,IAAI,YAAY,UAAUJ,CAAS,GAAI,CACzD,OAAQC,EACR,QAAS,GACT,WAAY,EACpB,CAAO,EACD,KAAK,QAAQ,cAAcG,CAAW,CAC5C,CACA,CAEE,IAAIJ,EAAWE,EAAS,CACtB,OAAK,KAAK,gBAAgBF,CAAS,IACjC,KAAK,gBAAgBA,CAAS,EAAI,IAEpC,KAAK,gBAAgBA,CAAS,EAAE,KAAKE,CAAO,EACrCA,CACX,CAEE,KAAKF,EAAWE,EAAS,CACnB,KAAK,gBAAgBF,CAAS,IAChC,KAAK,gBAAgBA,CAAS,EAAI,KAAK,gBAAgBA,CAAS,EAAE,OAAOK,GAAMA,IAAOH,CAAO,EAEnG,CAEE,MAAM,SAASI,EAAU,CACvB,GAAI,CACF,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAGA,GACjC,MAAM,KAAK,UAAU,SACrB,KAAK,cAAc,iBACzB,OAAaC,EAAO,CACd,QAAQ,MAAM,4CAA4C,KAAK,YAAY,IAAI,KAAMA,CAAK,EAEtF,KAAK,WAAa,OAAO,KAAK,UAAU,cAAiB,YAC3D,MAAM,KAAK,UAAU,aAAa,CAAE,MAAO,SAAU,KAAM,WAAY,MAAAA,EAAO,KAAM,CAACD,CAAQ,CAAC,CAAE,CAExG,CACA,CAEE,MAAM,SAASE,EAAU,CACvB,GAAI,CACF,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAGA,GACjC,MAAM,KAAK,UAAU,SACrB,KAAK,cAAc,iBACzB,OAAaD,EAAO,CACd,QAAQ,MAAM,4CAA4C,KAAK,YAAY,IAAI,KAAMA,CAAK,EAEtF,KAAK,WAAa,OAAO,KAAK,UAAU,cAAiB,YAC3D,MAAM,KAAK,UAAU,aAAa,CAAE,MAAO,SAAU,KAAM,WAAY,MAAAA,EAAO,KAAM,CAACC,CAAQ,CAAC,CAAE,CAExG,CACA,CAEE,MAAM,OAAQ,CACZ,GAAI,OAAK,WAAa,KAAK,aAE3B,GAAI,CAKF,GAJA,KAAK,oBAAmB,EAExB,MAAM,KAAK,UAAU,YAEjB,OAAO,yBAA2B,OAAO,eAC3C,KAAK,aAAe,IAAI,OAAO,aAAa,IAAI,EAChD,OAAO,wBAAwB,KAAK,YAAY,EAE5C,OAAO,KAAK,OAAU,YAAY,CACpC,MAAMC,EAAS,KAAK,QAChBA,aAAkB,SACpB,MAAMA,CAElB,CAGM,KAAK,UAAY,GACjB,MAAM,KAAK,UAAU,QAErB,KAAK,cAAc,kBAEf,OAAO,oBACT,OAAO,mBAAkB,CAEjC,OAAaF,EAAO,CAOd,GANA,QAAQ,MAAM,+CAA+C,KAAK,YAAY,IAAI,KAAMA,CAAK,EAEzF,KAAK,WAAa,OAAO,KAAK,UAAU,cAAiB,YAC3D,MAAM,KAAK,UAAU,aAAa,CAAE,MAAO,QAAS,KAAM,YAAa,MAAAA,EAAO,KAAM,CAAA,CAAE,CAAE,EAGtF,OAAO,KAAK,aAAgB,WAC9B,GAAI,CACF,KAAK,YAAYA,CAAK,CAChC,OAAiBJ,EAAG,CACV,QAAQ,MAAM,+CAA+C,KAAK,YAAY,IAAI,KAAMA,CAAC,CACnG,MAEQ,KAAK,QAAQ,UAAY;AAAA;AAAA;AAAA,mEAGkCI,EAAM,OAAO;AAAA;AAAA,SAIhF,CACA,CAEE,qBAAsB,CACpB,GAAI,KAAK,YAAa,OAEtB,MAAMG,EAAU,CACd,YAAa,cACb,OAAQ,CAAC,QAAS,QAAQ,EAC1B,WAAY,aACZ,QAAS,cACT,cAAe,gBACf,aAAc,eACd,YAAa,eACnB,EAEI,IAAIC,EAAQ,OAAO,eAAe,IAAI,EACtC,MAAMC,EAAkB,IAAI,IAE5B,KAAOD,GAASA,EAAM,cAAgB,QAAUA,EAAM,cAAgBpB,GAAiB,CACrF,SAAW,CAACsB,EAAYC,CAAc,IAAK,OAAO,QAAQJ,CAAO,EAC3DE,EAAgB,IAAIC,CAAU,GAE9BF,EAAM,eAAeE,CAAU,IAC7B,MAAM,QAAQC,CAAc,EAC9BA,EAAe,QAAQC,GAAS,CAC1BF,IAAe,UACjB,KAAK,UAAU,GAAGE,EAAO,IAAM,KAAK,SAAM,CAAI,CAE9D,CAAa,EACQF,IAAe,cACxB,KAAK,UAAU,GAAGC,EAAiBE,IACjC,KAAK,YAAYA,EAAU,KAAK,EACzB,UACR,EAED,KAAK,UAAU,GAAGF,EAAgB,IAAM,KAAKD,CAAU,IAAC,CAAI,EAE9DD,EAAgB,IAAIC,CAAU,GAGlCF,EAAQ,OAAO,eAAeA,CAAK,CACzC,CAEI,KAAK,YAAc,EACvB,CAEE,MAAM,SAAU,CACd,GAAI,GAAC,KAAK,WAAa,KAAK,aAE5B,GAAI,CACF,KAAK,cAAc,oBAEnB,MAAM,KAAK,UAAU,UACrB,KAAK,UAAY,GACjB,KAAK,YAAc,GACnB,MAAM,KAAK,UAAU,SAC3B,OAAaJ,EAAO,CACd,QAAQ,MAAM,iDAAiD,KAAK,YAAY,IAAI,KAAMA,CAAK,EAE3F,KAAK,WAAa,OAAO,KAAK,UAAU,cAAiB,YAC3D,MAAM,KAAK,UAAU,aAAa,CAAE,MAAO,UAAW,KAAM,YAAa,MAAAA,EAAO,KAAM,CAAA,CAAE,CAAE,EAG5F,KAAK,UAAY,GACjB,KAAK,YAAc,EACzB,CACA,CAEE,aAAc,CAAA,CACd,YAAa,CAAA,CACb,eAAgB,CAAA,CAChB,cAAe,CAAA,CACf,QAAS,CAAA,CACT,YAAYA,EAAO,CAAA,CACnB,SAAU,CAAA,CACV,OAAQ,CAAA,EAGV,SAASU,EAAWC,EAAgBC,EAAO,CACzC,OAAO,KAAKA,CAAK,EAAE,QAAQC,GAAO,CAChC,GAAIA,IAAQ,cACZ,GAAI,OAAOD,EAAMC,CAAG,GAAM,WAAY,CACpC,MAAMC,EAAWH,EAAe,UAAUE,CAAG,EACzCC,EACFH,EAAe,UAAUE,CAAG,EAAI,YAAYE,EAAM,CAChD,OAAAH,EAAMC,CAAG,EAAE,MAAM,KAAME,CAAI,EACpBD,EAAS,MAAM,KAAMC,CAAI,CAC1C,EAEQJ,EAAe,UAAUE,CAAG,EAAID,EAAMC,CAAG,CAEjD,MACMF,EAAe,UAAUE,CAAG,EAAID,EAAMC,CAAG,CAE/C,CAAG,CACH,CAEqCG,EAAO,QAC1CA,UAAiB,CAAE,gBAAAhC,EAAiB,WAAA0B,CAAU,GAE9C,OAAO,gBAAkB1B,EACzB,OAAO,WAAa0B,wFClRtB,MAAMO,CAAwB,CAC5B,aAAc,CACZ,KAAK,WAAa,IAAI,IACtB,KAAK,eAAiB,IAAI,IAC1B,KAAK,iBAAmB,IAAI,IAC5B,KAAK,UAAY,IAAI,IACrB,KAAK,SAAW,KAChB,KAAK,OAAS,IAAI,IAClB,KAAK,gBAAkB,IAAI,GAC/B,CAEE,SAAS7B,EAAMuB,EAAgB,CAC7B,GAAI,EAAEA,EAAe,qBAAqB,OAAO,iBAC/C,MAAM,IAAI,MAAM,aAAavB,CAAI,8BAA8B,EAEjE,KAAK,WAAW,IAAIA,EAAMuB,CAAc,CAC5C,CAEE,aAAavB,EAAM8B,EAAQ,CACzB,KAAK,eAAe,IAAI9B,EAAM8B,CAAM,CACxC,CAEE,WAAW9B,EAAM,CACf,KAAK,WAAW,OAAOA,CAAI,EAC3B,KAAK,eAAe,OAAOA,CAAI,EAC/B,KAAK,iBAAiB,OAAOA,CAAI,EACjC,KAAK,gBAAgB,OAAOA,CAAI,CACpC,CAEE,IAAIA,EAAM,CACR,OAAO,KAAK,WAAW,IAAIA,CAAI,GAAK,KAAK,iBAAiB,IAAIA,CAAI,CACtE,CAEE,MAAM,SAASA,EAAM,CACnB,MAAM+B,EAAS,KAAK,WAAW,IAAI/B,CAAI,GAAK,KAAK,iBAAiB,IAAIA,CAAI,EAC1E,GAAI+B,EAAQ,OAAOA,EAEnB,GAAI,KAAK,gBAAgB,IAAI/B,CAAI,EAC/B,OAAO,KAAK,gBAAgB,IAAIA,CAAI,EAGtC,MAAM8B,EAAS,KAAK,eAAe,IAAI9B,CAAI,EAC3C,GAAI,CAAC8B,EACH,MAAM,IAAI,MAAM,aAAa9B,CAAI,YAAY,EAG/C,MAAMgC,GAAkB,SAAY,CAClC,GAAI,CACF,MAAMlB,EAAS,MAAMgB,IACfP,EAAiBT,EAAO,SAAWA,EACzC,GAAI,EAAES,EAAe,qBAAqB,OAAO,iBAC/C,MAAM,IAAI,MAAM,aAAavB,CAAI,8BAA8B,EAEjE,YAAK,iBAAiB,IAAIA,EAAMuB,CAAc,EACvCA,CACf,OAAef,EAAG,CACV,WAAK,gBAAgB,OAAOR,CAAI,EAC1BQ,CACd,CACA,KAEI,YAAK,gBAAgB,IAAIR,EAAMgC,CAAc,EACtCA,CACX,CAEE,YAAYhC,EAAMwB,EAAO,CACvB,KAAK,OAAO,IAAIxB,EAAMwB,CAAK,CAC/B,CAEE,SAASD,KAAmBU,EAAY,CACtCA,EAAW,QAAQjC,GAAQ,CACzB,MAAMwB,EAAQ,KAAK,OAAO,IAAIxB,CAAI,EAC9BwB,GAAS,OAAO,YAClB,OAAO,WAAWD,EAAgBC,CAAK,CAE/C,CAAK,CACL,CAEE,MAAM,UAAUU,EAAO,SAAU,CAC/B,MAAM,KAAK,iBAAiBA,CAAI,EAChC,KAAK,eAAeA,CAAI,CAC5B,CAEE,MAAM,iBAAiBA,EAAM,CAC3B,MAAMC,EAAWD,EAAK,iBAAiB,kBAAkB,EACnDE,EAAW,CAAA,EACjBD,EAAS,QAAQtC,GAAW,CAC1BuC,EAAS,KAAK,KAAK,gBAAgBvC,CAAO,CAAC,CACjD,CAAK,EACD,MAAM,QAAQ,IAAIuC,CAAQ,CAC9B,CAEE,MAAM,gBAAgBvC,EAAS,CAC7B,GAAI,EAAAA,EAAQ,kBAAoBA,EAAQ,mBAExC,CAAAA,EAAQ,kBAAoB,GAE5B,GAAI,CACF,MAAMwC,EAAgBxC,EAAQ,aAAa,gBAAgB,EAE3D,GAAI,OAAO,mBAAqBwC,EAAe,CAC7C,MAAMC,EAAc,OAAO,kBAAkB,IAAID,CAAa,EAC9D,GAAIC,EACF,GAAI,CACF,MAAMA,EAAYzC,CAAO,EACzB,MACZ,OAAmBW,EAAG,CACV,QAAQ,KAAK,8CAA8C6B,CAAa,oCAAqC7B,CAAC,CAC1H,CAEA,CAEM,IAAI+B,EAAiB,KAAK,WAAW,IAAIF,CAAa,EAEtD,GAAI,CAACE,EAAgB,CACnB,GAAI,CACFA,EAAiB,MAAM,KAAK,SAASF,CAAa,CAC5D,OAAiB7B,EAAG,CACV,QAAQ,MAAM,4BAA4B6B,CAAa,IAAK7B,CAAC,EAC7D,MACV,CAEQ,GAAI,CAACX,EAAQ,YACX,MAEV,CAEM,MAAMoC,EAAapC,EAAQ,aAAa,aAAa,EAC/C0B,EAAiBgB,EACnBN,GAAc,OAAO,YACvBA,EAAW,MAAM,GAAG,EAAE,QAAQjC,GAAQ,CACpC,MAAMwB,EAAQ,KAAK,OAAO,IAAIxB,EAAK,KAAI,CAAE,EACrCwB,GACF,OAAO,WAAWD,EAAgBC,CAAK,CAEnD,CAAS,EAGH,MAAMgB,EAAW,IAAIjB,EAAe1B,CAAO,EAC3CA,EAAQ,iBAAmB2C,EAC3B,KAAK,UAAU,IAAI3C,EAAS2C,CAAQ,EACpCA,EAAS,MAAK,CACpB,QAAK,CACC3C,EAAQ,kBAAoB,EAClC,EACA,CAEE,eAAeqC,EAAM,CACf,KAAK,WAET,KAAK,SAAW,IAAI,iBAAkBO,GAAc,CAClDA,EAAU,QAAQC,GAAY,CAC5BA,EAAS,WAAW,QAAQC,GAAQ,CAC9BA,EAAK,WAAa,KAAK,eACrBA,EAAK,aAAa,gBAAgB,GACpC,KAAK,gBAAgBA,CAAI,EAAE,MAAMnC,GAAK,QAAQ,MAAMA,CAAC,CAAC,EAExD,KAAK,iBAAiBmC,CAAI,EAAE,MAAMnC,GAAK,QAAQ,MAAMA,CAAC,CAAC,EAEnE,CAAS,EAEDkC,EAAS,aAAa,QAAQC,GAAQ,CACpC,GAAIA,EAAK,WAAa,KAAK,aAAc,CACvC,MAAMH,EAAW,KAAK,UAAU,IAAIG,CAAI,EACpCH,IACFA,EAAS,QAAO,EAChB,KAAK,UAAU,OAAOG,CAAI,GAE5BA,EAAK,iBAAiB,kBAAkB,EAAE,QAAQC,GAAS,CACzD,MAAMC,EAAgB,KAAK,UAAU,IAAID,CAAK,EAC1CC,IACFA,EAAc,QAAO,EACrB,KAAK,UAAU,OAAOD,CAAK,EAE3C,CAAa,CACb,CACA,CAAS,CACT,CAAO,CACP,CAAK,EAED,KAAK,SAAS,QAAQV,EAAM,CAC1B,UAAW,GACX,QAAS,EACf,CAAK,EACL,CAEE,SAAU,CACJ,KAAK,WACP,KAAK,SAAS,aACd,KAAK,SAAW,MAElB,KAAK,UAAU,QAAQM,GAAY,CACjCA,EAAS,QAAO,CACtB,CAAK,EACD,KAAK,UAAU,QACf,KAAK,WAAW,QAChB,KAAK,OAAO,OAChB,EAGqCZ,EAAO,QAC1CA,EAAA,QAAiB,CAAE,wBAAAC,GAEnB,OAAO,wBAA0BA,uFC3MnC,MAAMiB,CAAa,CACjB,YAAYC,EAAU,GAAI,CACxB,KAAK,KAAOA,EAAQ,MAAQ,OAC5B,KAAK,OAASA,EAAQ,QAAU,CAAA,EAChC,KAAK,KAAOA,EAAQ,MAAQ,GAC5B,KAAK,aAAe,KACpB,KAAK,mBAAqB,GAC1B,KAAK,kBAAoB,GACzB,KAAK,UAAY,GACjB,KAAK,eAAiB,OACtB,KAAK,eAAiB,IAAI,IAC1B,KAAK,cAAgB,IAAM,KAAK,aAAY,EAE5C,KAAK,aAAY,EACjB,KAAK,YAAW,CACpB,CAEE,cAAe,CACb,KAAK,SAAW,IAAI,IACpB,KAAK,gBAAgB,KAAK,OAAQ,EAAE,CACxC,CAEE,gBAAgBC,EAAQC,EAAY,CAClCD,EAAO,QAAQE,GAAS,CACtB,MAAMC,EAAWD,EAAM,KAAK,WAAW,GAAG,EACtCA,EAAM,KACND,GAAcA,GAAc,CAACC,EAAM,KAAK,WAAW,GAAG,EAAI,IAAM,IAAMA,EAAM,KAC1EE,EAAY,KAAK,aAAaD,CAAQ,EAC5C,KAAK,SAAS,IAAIA,EAAU,CAAE,GAAGD,EAAO,MAAOE,EAAW,WAAAH,CAAU,CAAE,EAElEC,EAAM,UAAYA,EAAM,SAAS,OAAS,GAC5C,KAAK,gBAAgBA,EAAM,SAAUC,CAAQ,CAErD,CAAK,CACL,CAEE,aAAaE,EAAM,CACjB,MAAMC,EAAWD,EACd,QAAQ,UAAW,SAAS,EAC5B,QAAQ,MAAO,IAAI,EACtB,OAAO,IAAI,OAAO,IAAIC,CAAQ,GAAG,CACrC,CAEE,aAAc,CACR,KAAK,OAAS,OAChB,OAAO,iBAAiB,aAAc,KAAK,aAAa,EAExD,OAAO,iBAAiB,WAAY,KAAK,aAAa,CAE5D,CAEE,cAAe,CACb,MAAMD,EAAO,KAAK,kBAClB,KAAK,SAASA,CAAI,CACtB,CAEE,iBAAkB,CAChB,OAAI,KAAK,OAAS,OACT,SAAS,KAAK,MAAM,CAAC,GAAK,IAE5B,SAAS,SAAS,QAAQ,KAAK,KAAM,EAAE,GAAK,GACvD,CAEE,MAAM,SAASA,EAAME,EAAU,GAAO,CACpC,MAAML,EAAQ,KAAK,YAAYG,CAAI,EACnC,GAAI,CAACH,EAAO,OAEZ,MAAMM,EAAO,KAAK,aAElB,UAAWjD,KAAW,KAAK,mBAEzB,GADe,MAAMA,EAAQ2C,EAAOM,CAAI,IACzB,GAAO,OAGxB,KAAK,aAAeN,EACpB,KAAK,WAAWG,EAAME,CAAO,EAC7B,MAAM,KAAK,aAAaL,CAAK,EAE7B,UAAW3C,KAAW,KAAK,kBACzBA,EAAQ2C,CAAK,CAEnB,CAEE,YAAYG,EAAM,CAChB,SAAW,CAAA,CAAGH,CAAK,IAAK,KAAK,SAAU,CACrC,MAAMO,EAAQJ,EAAK,MAAMH,EAAM,KAAK,EACpC,GAAIO,EAAO,CACT,MAAMC,EAAS,CAAA,GACIR,EAAM,KAAK,MAAM,SAAS,GAAK,IACvC,QAAQ,CAAClD,EAAM2D,IAAU,CAClCD,EAAO1D,EAAK,MAAM,CAAC,CAAC,EAAIyD,EAAME,EAAQ,CAAC,CACjD,CAAS,EAED,MAAMC,EAAQ,KAAK,cAEnB,MAAO,CACL,GAAGV,EACH,OAAAQ,EACA,MAAAE,EACA,SAAUP,CACpB,CACA,CACA,CACI,OAAO,IACX,CAEE,aAAc,CACZ,MAAMQ,EAAS,SAAS,OAAO,MAAM,CAAC,EAChCH,EAAS,CAAA,EACf,OAAIG,GACFA,EAAO,MAAM,GAAG,EAAE,QAAQC,GAAQ,CAChC,KAAM,CAACrC,EAAKxB,CAAK,EAAI6D,EAAK,MAAM,GAAG,EACnCJ,EAAOjC,CAAG,EAAI,mBAAmBxB,GAAS,EAAE,CACpD,CAAO,EAEIyD,CACX,CAEE,WAAWL,EAAME,EAAS,CACxB,GAAI,KAAK,OAAS,OAAQ,CACxB,MAAMQ,EAAM,IAAIV,CAAI,GAChBE,EACF,SAAS,QAAQQ,CAAG,EAEpB,SAAS,KAAOV,CAExB,KAAW,CACL,MAAMU,EAAM,KAAK,KAAOV,EAAO,SAAS,OACpCE,EACF,QAAQ,aAAa,CAAA,EAAI,GAAIQ,CAAG,EAEhC,QAAQ,UAAU,CAAA,EAAI,GAAIA,CAAG,CAErC,CACA,CAEE,MAAM,aAAab,EAAO,CACpBA,EAAM,YAAcA,EAAM,aAAe,GAC3C,MAAM,KAAK,mBAAmBA,CAAK,EAEnC,MAAM,KAAK,iBAAiBA,CAAK,CAEvC,CAEE,MAAM,iBAAiBA,EAAO,CAC5B,MAAMc,EAAY,SAAS,cAAc,oBAAoB,EAC7D,GAAI,CAACA,GAAa,CAACd,EAAM,UAAW,OAEpC,KAAK,4BAA4Bc,CAAS,EAE1CA,EAAU,UAAU,IAAI,mBAAmB,EAC3CA,EAAU,UAAU,OAAO,mBAAmB,EAE9C,MAAM,KAAK,kBAAkBA,CAAS,EAEtC,MAAM3B,EAAgB,MAAM,KAAK,kBAAkBa,EAAM,SAAS,EAClE,GAAI,CAACb,EAAe,OAEpB,MAAM4B,EAAmB,SAAS,cAAc,KAAK,EACrDA,EAAiB,aAAa,iBAAkB5B,CAAa,EAC7D4B,EAAiB,UAAU,IAAI,mBAAmB,EAElD,OAAO,KAAKf,EAAM,MAAM,EAAE,QAAQzB,GAAO,CACvCwC,EAAiB,aAAa,aAAaxC,CAAG,GAAIyB,EAAM,OAAOzB,CAAG,CAAC,CACzE,CAAK,EAEDuC,EAAU,UAAY,GACtBA,EAAU,YAAYC,CAAgB,EAElC,OAAO,gBACT,MAAM,OAAO,eAAe,UAAUD,CAAS,EAGjD,WAAW,IAAM,CACfA,EAAU,UAAU,OAAO,mBAAmB,EAC9CC,EAAiB,UAAU,OAAO,mBAAmB,CAC3D,EAAO,EAAE,CACT,CAEE,MAAM,mBAAmBf,EAAO,CAC9B,MAAMgB,EAAc,KAAK,SAAS,IAAIhB,EAAM,UAAU,EACtD,GAAI,CAACgB,EAAa,OAElB,MAAMC,EAAgB,SAAS,cAAc,oBAAoB,EACjE,GAAI,CAACA,EAAe,OAIpB,GAFuB,SAAS,cAAc,oBAAoBD,EAAY,SAAS,IAAI,EA6BzF,MAAM,KAAK,sBAAsBhB,CAAK,MA3BnB,CACnB,KAAK,4BAA4BiB,CAAa,EAE9CA,EAAc,UAAU,IAAI,mBAAmB,EAC/CA,EAAc,UAAU,OAAO,mBAAmB,EAElD,MAAM,KAAK,kBAAkBA,CAAa,EAE1C,MAAMC,EAAa,MAAM,KAAK,kBAAkBF,EAAY,SAAS,EACrE,GAAI,CAACE,EAAY,OAEjB,MAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,aAAa,iBAAkBD,CAAU,EAEvDD,EAAc,UAAY,GAC1BA,EAAc,YAAYE,CAAa,EAEnC,OAAO,gBACT,MAAM,OAAO,eAAe,UAAUF,CAAa,EAGrD,WAAW,IAAM,CACfA,EAAc,UAAU,OAAO,mBAAmB,CAC1D,EAAS,EAAE,EAEL,MAAM,KAAK,sBAAsBjB,CAAK,CAC5C,CAGA,CAEE,MAAM,sBAAsBA,EAAO,CACjC,MAAMmB,EAAgB,SAAS,cAAc,oBAAoB,KAAK,oBAAoBnB,EAAM,UAAU,CAAC,IAAI,EAC/G,GAAI,CAACmB,EAAe,OAEpB,MAAML,EAAYK,EAAc,cAAc,oBAAoB,EAClE,GAAI,CAACL,GAAa,CAACd,EAAM,UAAW,OAEpC,MAAMb,EAAgB,MAAM,KAAK,kBAAkBa,EAAM,SAAS,EAClE,GAAI,CAACb,EAAe,OAEpB,MAAM4B,EAAmB,SAAS,cAAc,KAAK,EACrDA,EAAiB,aAAa,iBAAkB5B,CAAa,EAC7D4B,EAAiB,UAAU,IAAI,mBAAmB,EAElD,OAAO,KAAKf,EAAM,MAAM,EAAE,QAAQzB,GAAO,CACvCwC,EAAiB,aAAa,aAAaxC,CAAG,GAAIyB,EAAM,OAAOzB,CAAG,CAAC,CACzE,CAAK,EAEDuC,EAAU,UAAY,GACtBA,EAAU,YAAYC,CAAgB,EAElC,OAAO,gBACT,MAAM,OAAO,eAAe,UAAUD,CAAS,EAGjD,WAAW,IAAM,CACfC,EAAiB,UAAU,OAAO,mBAAmB,CAC3D,EAAO,EAAE,CACT,CAEE,MAAM,kBAAkBK,EAAW,CACjC,GAAI,OAAOA,GAAc,WAAY,CACnC,MAAMC,EAAWD,EAAU,WAC3B,GAAI,KAAK,eAAe,IAAIC,CAAQ,EAClC,OAAO,KAAK,eAAe,IAAIA,CAAQ,EAGzC,GAAI,CACF,MAAMzD,EAAS,MAAMwD,IACf/C,EAAiBT,EAAO,SAAWA,EAEnCuB,EAAgB,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAErE,OAAI,OAAO,gBACT,OAAO,eAAe,SAASA,EAAed,CAAc,EAG9D,KAAK,eAAe,IAAIgD,EAAUlC,CAAa,EACxCA,CACf,OAAe7B,EAAG,CACV,eAAQ,MAAM,iCAAkCA,CAAC,EAC1C,IACf,CACA,CAEI,GAAI,OAAO8D,GAAc,UAAYA,EAAU,WAAW,OAAO,EAAG,CAClE,MAAMjC,EAAgBiC,EAAU,MAAM,CAAC,EACvC,GAAI,OAAO,eACT,GAAI,CACF,MAAM,OAAO,eAAe,SAASjC,CAAa,CAC5D,OAAiB7B,EAAG,CACV,eAAQ,MAAM,iCAAiC6B,CAAa,IAAK7B,CAAC,EAC3D,IACjB,CAEM,OAAO6B,CACb,CAEI,OAAOiC,CACX,CAEE,oBAAoBrB,EAAY,CAC9B,SAAW,CAACI,EAAMH,CAAK,IAAK,KAAK,SAC/B,GAAIG,IAASJ,EACX,OAAOC,EAAM,UAGjB,OAAO,IACX,CAEE,aAAalD,EAAM,CACjB,KAAK,eAAiBA,CAC1B,CAEE,KAAKqD,EAAM,CACT,KAAK,SAASA,EAAM,EAAK,CAC7B,CAEE,QAAQA,EAAM,CACZ,KAAK,SAASA,EAAM,EAAI,CAC5B,CAEE,GAAGmB,EAAO,CACR,QAAQ,GAAGA,CAAK,CACpB,CAEE,MAAO,CACL,QAAQ,KAAI,CAChB,CAEE,SAAU,CACR,QAAQ,QAAO,CACnB,CAEE,WAAWjE,EAAS,CAClB,KAAK,mBAAmB,KAAKA,CAAO,CACxC,CAEE,UAAUA,EAAS,CACjB,KAAK,kBAAkB,KAAKA,CAAO,CACvC,CAEE,kBAAkBV,EAAS,CACzB,OAAO,IAAI,QAAQ4E,GAAW,CAC5B,MAAMC,EAAqB,KAAK,uBAAuB7E,CAAO,EAC9D,GAAI6E,EAAqB,EAAG,CAC1B,MAAMC,EAAU,IAAM,CACpB9E,EAAQ,oBAAoB,gBAAiB8E,CAAO,EACpD9E,EAAQ,oBAAoB,eAAgB8E,CAAO,EACnDF,GACV,EACQ5E,EAAQ,iBAAiB,gBAAiB8E,CAAO,EACjD9E,EAAQ,iBAAiB,eAAgB8E,CAAO,EAChD,WAAWA,EAASD,EAAqB,GAAG,CACpD,MACQD,GAER,CAAK,CACL,CAEE,uBAAuB5E,EAAS,CAC9B,MAAM+E,EAAQ,OAAO,iBAAiB/E,CAAO,EACvC6E,EAAqB,WAAWE,EAAM,kBAAkB,GAAK,EAC7DC,EAAoB,WAAWD,EAAM,iBAAiB,GAAK,EACjE,OAAO,KAAK,IAAIF,EAAoBG,CAAiB,EAAI,GAC7D,CAEE,4BAA4Bb,EAAW,CAClBA,EAAU,iBAAiB,kBAAkB,EACrD,QAAQnE,GAAW,CAC5B,MAAM2C,EAAW3C,EAAQ,iBACrB2C,GAAY,OAAOA,EAAS,SAAY,YAC1CA,EAAS,QAAO,EAAG,MAAMhC,GAAK,QAAQ,MAAM,8BAA+BA,CAAC,CAAC,CAErF,CAAK,EAEG,OAAO,mBACWwD,EAAU,iBAAiB,gPAAgP,EACnR,QAAQnE,GAAW,CAC7B,OAAO,kBAAkB,QAAQA,CAAO,CAChD,CAAO,CAEP,CAEE,SAAU,CACJ,KAAK,OAAS,OAChB,OAAO,oBAAoB,aAAc,KAAK,aAAa,EAE3D,OAAO,oBAAoB,WAAY,KAAK,aAAa,EAE3D,KAAK,OAAS,GACd,KAAK,SAAS,QACd,KAAK,mBAAqB,GAC1B,KAAK,kBAAoB,EAC7B,EAGA,SAASiF,EAAa/B,EAAS,CAC7B,OAAO,IAAID,EAAaC,CAAO,CACjC,CAEqCnB,EAAO,QAC1CA,UAAiB,CAAE,aAAAkB,EAAc,aAAAgC,CAAY,GAE7C,OAAO,aAAehC,EACtB,OAAO,aAAegC,wFC1YxB,MAAMC,CAAW,CACf,YAAYhC,EAAU,GAAI,CACxB,KAAK,QAAUA,EAAQ,SAAW,GAClC,KAAK,QAAUA,EAAQ,SAAW,IAClC,KAAK,QAAUA,EAAQ,SAAW,CAAA,EAClC,KAAK,MAAQ,IAAI,IACjB,KAAK,SAAWA,EAAQ,UAAY,IACpC,KAAK,WAAaA,EAAQ,YAAc,EACxC,KAAK,WAAaA,EAAQ,YAAc,IACxC,KAAK,eAAiB,IAAI,IAC1B,KAAK,gBAAkBA,EAAQ,iBAAmB,GAElD,KAAK,UAAY,OAAO,MAAU,IAC9B,KAAK,WACP,KAAK,WAAWA,CAAO,EAGrBA,EAAQ,eACV,KAAK,aAAeA,EAAQ,aAElC,CAEE,WAAWA,EAAS,CAClB,KAAK,MAAQ,MAAM,OAAO,CACxB,QAAS,KAAK,QACd,QAAS,KAAK,QACd,QAAS,KAAK,OACpB,CAAK,EAED,KAAK,MAAM,SAAS,gBAAkBA,EAAQ,iBAAmB,EACrE,CAEE,kBAAkBiC,EAAQ,CACxB,KAAM,CAAE,IAAAjB,EAAK,OAAAkB,EAAS,MAAO,OAAAvB,EAAS,CAAA,EAAI,KAAApD,EAAO,IAAI,EAAK0E,EACpDpB,EAAQF,EAAS,IAAI,gBAAgBA,CAAM,EAAE,SAAQ,EAAK,GAC1DwB,EAAU5E,EAAO,KAAK,UAAUA,CAAI,EAAI,GAC9C,MAAO,GAAG2E,CAAM,IAAIlB,CAAG,IAAIH,CAAK,IAAIsB,CAAO,EAC/C,CAEE,UAAUzD,EAAK,CACb,MAAMM,EAAS,KAAK,MAAM,IAAIN,CAAG,EACjC,OAAIM,GAAU,KAAK,IAAG,EAAKA,EAAO,UAAY,KAAK,SAC1CA,EAAO,MAEhB,KAAK,MAAM,OAAON,CAAG,EACd,KACX,CAEE,UAAUA,EAAKnB,EAAM,CACnB,KAAK,MAAM,IAAImB,EAAK,CAAE,KAAAnB,EAAM,UAAW,KAAK,IAAG,CAAE,CAAE,CACvD,CAEE,MAAM,kBAAkB0E,EAAQG,EAAa,EAAG,CAC9C,GAAI,CACF,OAAO,MAAM,KAAK,SAASH,CAAM,CACvC,OAAapE,EAAO,CACd,GAAIuE,EAAa,KAAK,WACpB,aAAM,IAAI,QAAQV,GAAW,WAAWA,EAAS,KAAK,WAAa,KAAK,IAAI,EAAGU,CAAU,CAAC,CAAC,EACpF,KAAK,kBAAkBH,EAAQG,EAAa,CAAC,EAEtD,MAAMvE,CACZ,CACA,CAEE,MAAM,SAASoE,EAAQ,CACrB,KAAM,CACJ,IAAAjB,EACA,OAAAkB,EAAS,MACT,QAAAG,EAAU,CAAA,EACV,OAAA1B,EAAS,CAAA,EACT,KAAApD,EAAO,KACP,QAAA+E,EAAU,KAAK,QACf,MAAAC,EAAQ,IACNN,EAEET,EAAW,KAAK,kBAAkB,CAAE,IAAAR,EAAK,OAAAkB,EAAQ,OAAAvB,EAAQ,KAAApD,CAAI,CAAE,EAErE,GAAIgF,GAASL,IAAW,MAAO,CAC7B,MAAMlD,EAAS,KAAK,UAAUwC,CAAQ,EACtC,GAAIxC,EACF,OAAOA,CAEf,CAEI,MAAMwD,EAAa,IAAI,gBACvB,KAAK,eAAe,IAAIhB,EAAUgB,CAAU,EAE5C,MAAMC,EAAiB,CAAE,GAAG,KAAK,QAAS,GAAGJ,CAAO,EAEhD,CAACI,EAAe,cAAc,GAAKlF,GAAQ,EAAEA,aAAgB,YAC/DkF,EAAe,cAAc,EAAI,oBAGnC,IAAIC,EAAgB,CAClB,IAAK,KAAK,QAAU,IAAI,IAAI1B,EAAK,KAAK,OAAO,EAAE,SAAQ,EAAKA,EAC5D,OAAAkB,EACA,QAASO,EACT,OAAQD,EAAW,OACnB,YAAa,KAAK,gBAAkB,UAAY,aACtD,EAEI,GAAI,OAAO,KAAK7B,CAAM,EAAE,OAAS,EAAG,CAClC,MAAMgC,EAAS,IAAI,IAAID,EAAc,GAAG,EACxC,OAAO,KAAK/B,CAAM,EAAE,QAAQjC,GAAO,CACjCiE,EAAO,aAAa,OAAOjE,EAAKiC,EAAOjC,CAAG,CAAC,CACnD,CAAO,EACDgE,EAAc,IAAMC,EAAO,UACjC,CAMI,GAJIpF,IAAS,OACXmF,EAAc,KAAOnF,aAAgB,SAAWA,EAAO,KAAK,UAAUA,CAAI,GAGxE,KAAK,cAAgB,KAAK,aAAa,QACzC,GAAI,CACF,MAAMqF,EAAc,MAAM,KAAK,aAAa,QAAQF,CAAa,EAC7DE,IAAaF,EAAgBE,EACzC,OAAe/E,EAAO,CAEd,GADA,KAAK,eAAe,OAAO2D,CAAQ,EAC/B,KAAK,aAAa,aACpB,OAAO,KAAK,aAAa,aAAa3D,CAAK,EAE7C,MAAMA,CACd,CAGI,GAAI,CACF,IAAIgF,EACJ,GAAI,KAAK,UAAW,CAClB,MAAMC,EAAc,CAClB,IAAKJ,EAAc,IAAI,QAAQ,KAAK,QAAS,EAAE,EAC/C,OAAQA,EAAc,OACtB,QAASA,EAAc,QACvB,OAAQA,EAAc,OACtB,QAAAJ,CACV,EACY/E,IAAS,OAAMuF,EAAY,KAAOvF,GAClCoD,GAAU,OAAO,KAAKA,CAAM,EAAE,OAAS,IAAGmC,EAAY,OAASnC,GAEnEkC,EAAW,MAAM,KAAK,MAAMC,CAAW,CAC/C,SACQD,EAAW,MAAM,KAAK,kBAAkBH,EAAeJ,CAAO,EAE1D,CAACO,EAAS,GAAI,CAChB,MAAMhF,EAAQ,IAAI,MAAM,uBAAuBgF,EAAS,MAAM,EAAE,EAChE,MAAAhF,EAAM,OAASgF,EAAS,OACxBhF,EAAM,WAAagF,EAAS,WACtBhF,CAChB,CAGM,MAAME,EAAS,CACb,KAAM,KAAK,UAAY8E,EAAS,KAAO,MAAM,KAAK,eAAeA,CAAQ,EACzE,QAAQ,KAAK,UAAYA,EAAS,QAClC,YAAY,KAAK,UAAYA,EAAS,YACtC,QAAS,KAAK,UAAYA,EAAS,QAAU,KAAK,cAAcA,EAAS,OAAO,EAChF,OAAQH,CAChB,EAEM,OAAI,KAAK,cAAgB,KAAK,aAAa,SAClC,KAAK,aAAa,SAAS3E,CAAM,GAGtCwE,GAASL,IAAW,OACtB,KAAK,UAAUV,EAAUzD,CAAM,EAG1BA,EACb,OAAaF,EAAO,CACd,GAAIA,EAAM,OAAS,cAAiB,KAAK,WAAaA,EAAM,OAAS,eACnE,OAAO,KAET,GAAI,KAAK,cAAgB,KAAK,aAAa,cACzC,OAAO,KAAK,aAAa,cAAcA,CAAK,EAE9C,MAAMA,CACZ,QAAK,CACC,KAAK,eAAe,OAAO2D,CAAQ,CACzC,CACA,CAEE,MAAM,kBAAkBS,EAAQK,EAAS,CACvC,MAAME,EAAa,IAAI,gBACjBO,EAASP,EAAW,OAEpBQ,EAAiB,IAAI,QAAQ,CAACC,EAAGC,IAAW,CAChD,MAAMC,EAAU,WAAW,IAAM,CAC/BX,EAAW,MAAK,EAChBU,EAAO,IAAI,MAAM,iBAAiB,CAAC,CAC3C,EAASZ,CAAO,EAEVS,EAAO,iBAAiB,QAAS,IAAM,CACrC,aAAaI,CAAO,CAC5B,CAAO,CACP,CAAK,EAEKC,EAAe,MAAM,CAAE,GAAGnB,EAAQ,OAAAc,CAAM,CAAE,EAEhD,OAAO,QAAQ,KAAK,CAACK,EAAcJ,CAAc,CAAC,CACtD,CAEE,MAAM,eAAeH,EAAU,CAC7B,MAAMQ,EAAcR,EAAS,QAAQ,IAAI,cAAc,EACvD,OAAIQ,GAAeA,EAAY,SAAS,kBAAkB,EACjDR,EAAS,OAEXA,EAAS,MACpB,CAEE,cAAcR,EAAS,CACrB,MAAMtE,EAAS,CAAA,EACf,OAAAsE,EAAQ,QAAQ,CAACnF,EAAOwB,IAAQ,CAC9BX,EAAOW,CAAG,EAAIxB,CACpB,CAAK,EACMa,CACX,CAEE,cAAciD,EAAKL,EAAS,CAAA,EAAIuB,EAAS,MAAO3E,EAAO,KAAM,CAC3D,MAAMiE,EAAW,KAAK,kBAAkB,CAAE,IAAAR,EAAK,OAAAkB,EAAQ,OAAAvB,EAAQ,KAAApD,CAAI,CAAE,EACrE,OAAI,KAAK,eAAe,IAAIiE,CAAQ,GAClC,KAAK,eAAe,IAAIA,CAAQ,EAAE,MAAK,EACvC,KAAK,eAAe,OAAOA,CAAQ,EAC5B,IAEF,EACX,CAEE,mBAAoB,CAClB,KAAK,eAAe,QAASgB,GAAe,CAC1CA,EAAW,MAAK,CACtB,CAAK,EACD,KAAK,eAAe,OACxB,CAEE,YAAa,CACX,KAAK,MAAM,OACf,CAEE,gBAAgBxB,EAAK,CACnB,KAAK,MAAM,QAAQ,CAACiC,EAAGvE,IAAQ,CACzBA,EAAI,WAAW,OAAOsC,CAAG,EAAE,GAC7B,KAAK,MAAM,OAAOtC,CAAG,CAE7B,CAAK,CACL,CAEE,IAAIsC,EAAKiB,EAAS,GAAI,CACpB,MAAMqB,EAAWrB,EAAO,OAAS,GAC3BsB,EAAWtB,EAAO,OAAS,KAAK,WAAa,EAE7CS,EAAgB,CAAE,GAAGT,EAAQ,IAAAjB,EAAK,OAAQ,MAAO,MAAOsC,GAE9D,OAAIC,EACK,KAAK,kBAAkBb,CAAa,EAEtC,KAAK,SAASA,CAAa,CACtC,CAEE,KAAK1B,EAAKzD,EAAO,KAAM0E,EAAS,CAAA,EAAI,CAClC,MAAMsB,EAAWtB,EAAO,OAAS,KAAK,WAAa,EAC7CS,EAAgB,CAAE,GAAGT,EAAQ,IAAAjB,EAAK,OAAQ,OAAQ,KAAAzD,EAAM,MAAO,IAErE,OAAIgG,EACK,KAAK,kBAAkBb,CAAa,EAEtC,KAAK,SAASA,CAAa,CACtC,CAEE,MAAM,WAAW1B,EAAKwC,EAAMxD,EAAU,CAAA,EAAI,CACxC,KAAM,CACJ,UAAAyD,EAAY,EAAI,KAAO,KACvB,WAAAC,EACA,QAAArB,EAAU,CAAA,EACV,SAAAsB,EAAW,IACT3D,EAEE4D,EAAc,KAAK,KAAKJ,EAAK,KAAOC,CAAS,EACnD,IAAII,EAAiB,EACjBC,EAAW,EAEf,MAAMC,EAAS,KAAK,gBAAgBP,CAAI,EAExC,GAAIG,EAAU,CACZ,MAAMtE,EAAW,CAAA,EACjB,QAAS2E,EAAI,EAAGA,EAAIJ,EAAaI,IAAK,CACpC,MAAMC,EAAU,KAAK,aAAajD,EAAKwC,EAAMQ,EAAGJ,EAAaH,EAAWM,EAAQ1B,CAAO,EACpF,KAAK,IAAM,CACVwB,IACAC,EAAW,KAAK,MAAOD,EAAiBD,EAAe,GAAG,EAEtDF,GACFA,EAAW,CACT,SAAAI,EACA,SAAUD,EAAiBJ,EAC3B,MAAOD,EAAK,KACZ,aAAcK,EACd,YAAAD,CAChB,CAAe,CAEf,CAAW,EACHvE,EAAS,KAAK4E,CAAO,CAC7B,CACM,aAAM,QAAQ,IAAI5E,CAAQ,EACnB,KAAK,gBAAgB2B,EAAK+C,EAAQH,EAAaJ,EAAK,IAAI,CACrE,CAEI,QAASQ,EAAI,EAAGA,EAAIJ,EAAaI,IAC/B,MAAM,KAAK,aAAahD,EAAKwC,EAAMQ,EAAGJ,EAAaH,EAAWM,EAAQ1B,CAAO,EAE7EwB,IACAC,EAAW,KAAK,MAAOD,EAAiBD,EAAe,GAAG,EAEtDF,GACFA,EAAW,CACT,SAAAI,EACA,SAAUD,EAAiBJ,EAC3B,MAAOD,EAAK,KACZ,aAAcQ,EAAI,EAClB,YAAAJ,CACV,CAAS,EAIL,OAAO,KAAK,gBAAgB5C,EAAK+C,EAAQH,EAAaJ,EAAK,IAAI,CACnE,CAEE,MAAM,aAAaxC,EAAKwC,EAAMU,EAAYN,EAAaH,EAAWM,EAAQ1B,EAAS,CACjF,MAAM8B,EAAQD,EAAaT,EACrBW,EAAM,KAAK,IAAID,EAAQV,EAAWD,EAAK,IAAI,EAC3Ca,EAAQb,EAAK,MAAMW,EAAOC,CAAG,EAE7BE,EAAW,IAAI,SACrB,OAAAA,EAAS,OAAO,QAASD,CAAK,EAC9BC,EAAS,OAAO,aAAcJ,CAAU,EACxCI,EAAS,OAAO,cAAeV,CAAW,EAC1CU,EAAS,OAAO,SAAUP,CAAM,EAChCO,EAAS,OAAO,WAAYd,EAAK,IAAI,EACrCc,EAAS,OAAO,WAAYd,EAAK,IAAI,EAE9B,KAAK,KAAK,GAAGxC,CAAG,SAAUsD,EAAU,CAAE,QAAAjC,CAAO,CAAE,CAC1D,CAEE,MAAM,gBAAgBrB,EAAK+C,EAAQH,EAAaW,EAAU,CACxD,OAAO,KAAK,KAAK,GAAGvD,CAAG,YAAa,CAAE,OAAA+C,EAAQ,YAAAH,EAAa,SAAAW,CAAQ,CAAE,CACzE,CAEE,gBAAgBf,EAAM,CACpB,MAAMgB,EAAO,GAAGhB,EAAK,IAAI,IAAIA,EAAK,IAAI,IAAIA,EAAK,YAAY,GAC3D,IAAIzF,EAAS,EACb,QAASiG,EAAI,EAAGA,EAAIQ,EAAK,OAAQR,IAC/BjG,GAAWA,GAAU,GAAKA,EAAUyG,EAAK,WAAWR,CAAC,EACrDjG,GAAU,EAEZ,OAAO,KAAK,IAAIA,CAAM,EAAE,SAAS,EAAE,EAAI,KAAK,IAAG,EAAG,SAAS,EAAE,CACjE,CAEE,IAAIiD,EAAKzD,EAAO,KAAM0E,EAAS,CAAA,EAAI,CACjC,MAAMsB,EAAWtB,EAAO,OAAS,KAAK,WAAa,EAC7CS,EAAgB,CAAE,GAAGT,EAAQ,IAAAjB,EAAK,OAAQ,MAAO,KAAAzD,EAAM,MAAO,IAEpE,OAAIgG,EACK,KAAK,kBAAkBb,CAAa,EAEtC,KAAK,SAASA,CAAa,CACtC,CAEE,OAAO1B,EAAKiB,EAAS,GAAI,CACvB,MAAMsB,EAAWtB,EAAO,OAAS,KAAK,WAAa,EAC7CS,EAAgB,CAAE,GAAGT,EAAQ,IAAAjB,EAAK,OAAQ,SAAU,MAAO,IAEjE,OAAIuC,EACK,KAAK,kBAAkBb,CAAa,EAEtC,KAAK,SAASA,CAAa,CACtC,CAEE,MAAM1B,EAAKzD,EAAO,KAAM0E,EAAS,CAAA,EAAI,CACnC,MAAMsB,EAAWtB,EAAO,OAAS,KAAK,WAAa,EAC7CS,EAAgB,CAAE,GAAGT,EAAQ,IAAAjB,EAAK,OAAQ,QAAS,KAAAzD,EAAM,MAAO,IAEtE,OAAIgG,EACK,KAAK,kBAAkBb,CAAa,EAEtC,KAAK,SAASA,CAAa,CACtC,CAEE,UAAUzF,EAAMC,EAAO,CACrB,KAAK,QAAQD,CAAI,EAAIC,EACjB,KAAK,QACP,KAAK,MAAM,SAAS,QAAQ,OAAOD,CAAI,EAAIC,EAEjD,CAEE,SAASuH,EAAOC,EAAO,SAAU,CAC/B,KAAK,QAAQ,cAAmB,GAAGA,CAAI,IAAID,CAAK,GAC5C,KAAK,QACP,KAAK,MAAM,SAAS,QAAQ,OAAO,cAAmB,GAAGC,CAAI,IAAID,CAAK,GAE5E,CAEE,YAAYE,EAAK,CACf,KAAK,SAAWA,CACpB,CAEE,cAAcC,EAAS,CACrB,KAAK,WAAaA,CACtB,EAGA,SAASC,EAAW7E,EAAS,CAC3B,OAAO,IAAIgC,EAAWhC,CAAO,CAC/B,CAEqCnB,EAAO,QAC1CA,UAAiB,CAAE,WAAAmD,EAAY,WAAA6C,CAAU,GAEzC,OAAO,WAAa7C,EACpB,OAAO,WAAa6C,wFCjatB,MAAMC,CAA6B,CACjC,aAAc,CACZ,KAAK,aAAe,IAAI,IACxB,KAAK,iBAAmB,IAAI,IAC5B,KAAK,kBAAoB,IAAI,OACjC,CAEE,SAAS7H,EAAM8H,EAAQC,EAAY,KAAM,CACvC,KAAK,aAAa,IAAI/H,EAAM8H,CAAM,EAC9BC,GACF,KAAK,iBAAiB,IAAI/H,EAAM+H,CAAS,CAE/C,CAEE,WAAW/H,EAAM,CACf,KAAK,aAAa,OAAOA,CAAI,EAC7B,KAAK,iBAAiB,OAAOA,CAAI,CACrC,CAEE,IAAIA,EAAM,CACR,OAAO,KAAK,aAAa,IAAIA,CAAI,CACrC,CAEE,IAAIA,EAAM,CACR,OAAO,KAAK,aAAa,IAAIA,CAAI,CACrC,CAEE,MAAM,WAAWH,EAAS,CACxB,GAAI,KAAK,kBAAkB,IAAIA,CAAO,EAAG,OAEzC,MAAMmI,EAAY,CAAC,iBAAkB,gBAAiB,cAAe,kBAClD,kBAAmB,cAAe,gBAAiB,cACnD,aAAc,cAAe,oBAAqB,gBAClD,qBAAsB,cAAc,EAEvD,UAAWjI,KAAQiI,EAAW,CAC5B,MAAM/H,EAAQJ,EAAQ,aAAaE,CAAI,EACvC,GAAIE,EAAO,CACT,MAAMD,EAAOC,GAASF,EAAK,QAAQ,QAAS,EAAE,EACxC+H,EAAS,KAAK,aAAa,IAAI9H,CAAI,GAAK,KAAK,aAAa,IAAID,EAAK,QAAQ,QAAS,EAAE,CAAC,EAE7F,GAAI+H,EAAQ,CACV,GAAI,CACF,MAAMA,EAAOjI,CAAO,EACpB,KAAK,kBAAkB,IAAIA,CAAO,CAC9C,OAAmBe,EAAO,CACd,QAAQ,MAAM,sDAAsDZ,CAAI,KAAMY,CAAK,CAC/F,CACU,MACV,CACA,CACA,CAEI,MAAMqH,EAAYpI,EAAQ,UACpBqI,EAAiB,CACrB,eAAgB,aAAc,iBAAkB,iBAChD,aAAc,eAAgB,aAAc,YAAa,aACzD,mBAAoB,eAAgB,qBAAsB,cAC1D,cAAe,UAAW,eAAgB,eAAgB,iBAC1D,mBAAoB,aAC1B,EAEI,UAAWC,KAAYD,EAAgB,CACrC,MAAME,EAAgBD,EAAS,QAAQ,IAAK,EAAE,EAC9C,GAAIF,EAAU,SAASG,CAAa,EAAG,CACrC,MAAMpI,EAAOoI,EAAc,QAAQ,MAAO,EAAE,EACtCN,EAAS,KAAK,aAAa,IAAI9H,CAAI,GAAK,KAAK,aAAa,IAAIoI,CAAa,EAEjF,GAAIN,EAAQ,CACV,GAAI,CACF,MAAMA,EAAOjI,CAAO,EACpB,KAAK,kBAAkB,IAAIA,CAAO,CAC9C,OAAmBe,EAAO,CACd,QAAQ,MAAM,sDAAsDZ,CAAI,KAAMY,CAAK,CAC/F,CACU,MACV,CACA,CACA,CACA,CAEE,QAAQf,EAAS,CACf,MAAMmI,EAAY,CAAC,iBAAkB,gBAAiB,cAAe,kBAClD,kBAAmB,cAAe,gBAAiB,cACnD,aAAc,cAAe,oBAAqB,gBAClD,qBAAsB,cAAc,EAEvD,UAAWjI,KAAQiI,EAAW,CAC5B,MAAM/H,EAAQJ,EAAQ,aAAaE,CAAI,EACvC,GAAIE,EAAO,CACT,MAAMD,EAAOC,GAASF,EAAK,QAAQ,QAAS,EAAE,EACxCgI,EAAY,KAAK,iBAAiB,IAAI/H,CAAI,GAAK,KAAK,iBAAiB,IAAID,EAAK,QAAQ,QAAS,EAAE,CAAC,EAExG,GAAIgI,EAAW,CACb,GAAI,CACFA,EAAUlI,CAAO,CAC7B,OAAmBe,EAAO,CACd,QAAQ,MAAM,qDAAqDZ,CAAI,KAAMY,CAAK,CAC9F,CACU,KAAK,kBAAkB,OAAOf,CAAO,EACrC,MACV,CACA,CACA,CAEI,MAAMoI,EAAYpI,EAAQ,UACpBqI,EAAiB,CACrB,eAAgB,aAAc,iBAAkB,iBAChD,aAAc,eAAgB,aAAc,YAAa,aACzD,mBAAoB,eAAgB,qBAAsB,cAC1D,cAAe,UAAW,eAAgB,eAAgB,iBAC1D,mBAAoB,aAC1B,EAEI,UAAWC,KAAYD,EAAgB,CACrC,MAAME,EAAgBD,EAAS,QAAQ,IAAK,EAAE,EAC9C,GAAIF,EAAU,SAASG,CAAa,EAAG,CACrC,MAAMpI,EAAOoI,EAAc,QAAQ,MAAO,EAAE,EACtCL,EAAY,KAAK,iBAAiB,IAAI/H,CAAI,GAAK,KAAK,iBAAiB,IAAIoI,CAAa,EAE5F,GAAIL,EAAW,CACb,GAAI,CACFA,EAAUlI,CAAO,CAC7B,OAAmBe,EAAO,CACd,QAAQ,MAAM,qDAAqDZ,CAAI,KAAMY,CAAK,CAC9F,CACU,KAAK,kBAAkB,OAAOf,CAAO,EACrC,MACV,CACA,CACA,CACA,CAEE,MAAM,cAAcqC,EAAO,SAAU,CACnC,MAAMC,EAAWD,EAAK,iBAAiB,ygBAQN,EAE3BE,EAAW,CAAA,EACjBD,EAAS,QAAQtC,GAAW,CACrB,KAAK,kBAAkB,IAAIA,CAAO,GACrCuC,EAAS,KAAK,KAAK,WAAWvC,CAAO,CAAC,CAE9C,CAAK,EACD,MAAM,QAAQ,IAAIuC,CAAQ,CAC9B,EAGA,MAAMiG,EAAoB,IAAIR,EAEOjG,EAAO,QAC1CA,UAAiB,CAAE,6BAAAiG,EAA8B,kBAAAQ,CAAiB,GAElE,OAAO,6BAA+BR,EACtC,OAAO,kBAAoBQ,kFChK7B,QAAI,OAAO,OAAW,IAAa,CACjC,KAAM,CAAE,gBAAAzI,EAAiB,WAAA0B,CAAU,EAAKgH,KAClC,CAAE,wBAAAzG,GAA4B0G,KAC9B,CAAE,aAAAzF,EAAc,aAAAgC,CAAY,EAAK0D,KACjC,CAAE,WAAAzD,EAAY,WAAA6C,CAAU,EAAKa,KAEnCC,UAAiB,CACf,gBAAA9I,EACA,WAAA0B,EACA,wBAAAO,EACA,aAAAiB,EACA,WAAAiC,EACA,aAAAD,EACA,WAAA8C,CACJ,CACA,CAEI,OAAO,0BACT,OAAO,eAAiB,IAAI,OAAO,yBAGrC,eAAee,GAAkB,CAC3B,OAAO,YACT,OAAO,WAAW,gBAEhB,OAAO,gBACT,MAAM,OAAO,eAAe,WAEhC,CAEA,OAAI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoBA,CAAe,EAE7D,WAAWA,EAAiB,CAAC,EAG/B,OAAO,kBAAoB,SAAS3I,EAAMuB,EAAgB,CACpD,OAAO,gBACT,OAAO,eAAe,SAASvB,EAAMuB,CAAc,CAEvD,EAEA,OAAO,sBAAwB,SAASvB,EAAM8B,EAAQ,CAChD,OAAO,gBACT,OAAO,eAAe,aAAa9B,EAAM8B,CAAM,CAEnD,EAEA,OAAO,oBAAsB,SAASI,EAAM,CAC1C,OAAI,OAAO,eACF,OAAO,eAAe,UAAUA,CAAI,EAEtC,QAAQ,SACjB,EAEA,OAAO,YAAc,SAASlC,EAAMwB,EAAO,CACrC,OAAO,gBACT,OAAO,eAAe,YAAYxB,EAAMwB,CAAK,CAEjD,EAEA,OAAO,SAAW,SAASD,KAAmBU,EAAY,CACpD,OAAO,gBACT,OAAO,eAAe,SAASV,EAAgB,GAAGU,CAAU,CAEhE,iBCjEA,IAAA2G,EAAA,KAAsB,CACpB,YAAYC,EAAQ,MAAO,CACzB,KAAK,MAAQA,EACb,KAAK,MAAQ,IAAI,IACjB,KAAK,MAAQ,UACb,KAAK,aAAe,CAAC,SAAS,EAC9B,KAAK,YAAc,IAAI,IAAI,CACzB,CAAC,UAAW,CAAC,eAAgB,WAAW,CAAC,EACzC,CAAC,eAAgB,CAAC,UAAW,WAAW,CAAC,EACzC,CAAC,UAAW,CAAC,UAAW,YAAa,WAAW,CAAC,EACjD,CAAC,UAAW,CAAC,UAAW,YAAa,WAAW,CAAC,EACjD,CAAC,YAAa,CAAC,UAAW,WAAW,CAAC,EACtC,CAAC,YAAa,CAAA,CAAE,CACtB,CAAK,EAED,KAAK,cAAgB,CACnB,UAAa,CAAE,KAAM,UAAW,GAAI,cAAc,EAClD,MAAS,CAAE,KAAM,CAAC,eAAgB,WAAW,EAAG,GAAI,SAAS,EAC7D,OAAU,CAAE,KAAM,CAAC,UAAW,SAAS,EAAG,GAAI,SAAS,EACvD,QAAW,CAAE,KAAM,CAAC,UAAW,SAAS,EAAG,GAAI,WAAW,EAC1D,QAAW,CAAE,KAAM,CAAC,eAAgB,UAAW,UAAW,WAAW,EAAG,GAAI,WAAW,CAC7F,EAEI,KAAK,WAAa,CAAC,YAAa,QAAS,SAAU,UAAW,SAAS,EACvE,KAAK,UAAY,CAAC,QAAS,eAAe,EAE1C,KAAK,WAAW,QAAQzH,GAAS,CAC/B,KAAK,UAAU,KAAK,SAASA,EAAM,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAM,MAAM,CAAC,CAAC,EAAE,EAC7E,KAAK,UAAU,KAAKA,CAAK,EACzB,KAAK,UAAU,KAAK,QAAQA,EAAM,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAM,MAAM,CAAC,CAAC,EAAE,CAC9E,CAAC,EAED,KAAK,UAAU,QAAQA,GAAS,CAC9B,KAAK,MAAM,IAAIA,EAAO,CAAA,CAAE,CAC1B,CAAC,EAED,KAAK,aAAe,IAAI,IACxB,KAAK,MAAQ,GACb,KAAK,aAAe,KACpB,KAAK,cAAgB,KACrB,KAAK,UAAY,KACjB,KAAK,WAAa,EAClB,KAAK,UAAY,GACjB,KAAK,iBAAmB,IAC1B,CAEA,oBAAoB0H,EAAW,CAC7B,MAAMC,EAAU,KAAK,YAAY,IAAI,KAAK,KAAK,EAC/C,GAAI,CAACA,GAAW,CAACA,EAAQ,SAASD,CAAS,EACzC,MAAM,IAAI,MAAM,6BAA6B,KAAK,KAAK,OAAOA,CAAS,EAAE,EAE3E,MAAO,EACT,CAEA,aAAaA,EAAW,CACtB,KAAK,oBAAoBA,CAAS,EAClC,KAAK,MAAQA,EACb,KAAK,aAAa,KAAKA,CAAS,CAClC,CAEA,eAAe1H,EAAO,CACpB,MAAM4H,EAAW,KAAK,MAAM,IAAI5H,CAAK,EACjC4H,GACFA,EAAS,QAAQC,GAAQ,CACvBA,EAAK,SAAW,EAClB,CAAC,CAEL,CAEA,GAAG7H,EAAOb,EAASwC,EAAU,CAAA,EAAI,CAC/B,GAAI,CAAC,KAAK,UAAU,SAAS3B,CAAK,EAChC,MAAM,IAAI,MAAM,4BAA4BA,CAAK,EAAE,EAGrD,MAAM8H,EAAQ,KAAK,MAAM,IAAI9H,CAAK,EAClC,OAAA8H,EAAM,KAAK,CACT,QAAA3I,EACA,SAAUwC,EAAQ,UAAY,EAC9B,QAASA,EAAQ,SAAW,CAAA,EAC5B,KAAMA,EAAQ,MAAQxC,EAAQ,MAAQ,aAAa2I,EAAM,MAAM,EACrE,CAAK,EAEDA,EAAM,KAAK,CAACC,EAAGC,IAAMA,EAAE,SAAWD,EAAE,QAAQ,EAErC,IAAM,CACX,MAAMxF,EAAQuF,EAAM,UAAUG,GAAKA,EAAE,UAAY9I,CAAO,EACpDoD,EAAQ,IACVuF,EAAM,OAAOvF,EAAO,CAAC,CAEzB,CACF,CAEA,MAAM,gBAAgB2F,EAASlI,EAAO,CACpC,GAAI,GAACkI,GAAWA,EAAQ,SAAW,GAEnC,UAAWC,KAAWD,EAAS,CAE7B,MAAME,EADa,KAAK,MAAM,IAAIpI,CAAK,EACZ,KAAKiI,GAAKA,EAAE,OAASE,CAAO,EACnDC,GAAW,CAACA,EAAQ,WACtB,MAAMA,EAAQ,UACdA,EAAQ,SAAW,GAEvB,CACF,CAEA,MAAM,KAAKpI,KAAUO,EAAM,CACzB,GAAI,KAAK,QAAU,aAAeP,IAAU,QAAS,OAErD,MAAM4H,EAAW,KAAK,MAAM,IAAI5H,CAAK,EACrC,GAAI,CAAC4H,GAAYA,EAAS,SAAW,EAAG,OAExC,MAAMS,EAAS,GAAGrI,CAAK,IAAI,KAAK,IAAG,CAAE,IAAI,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAChF,KAAK,aAAa,IAAIqI,CAAM,EAE5B,MAAMC,EAAY,YAAY,MAE9B,GAAI,CACF,UAAWT,KAAQD,EAAU,CAC3B,MAAM,KAAK,gBAAgBC,EAAK,QAAS7H,CAAK,EAE9C,MAAMuI,EAAgB,YAAY,MAClC,IAAIC,EAAYC,EAEhB,GAAI,CACFD,EAAaX,EAAK,QAAQ,GAAGtH,CAAI,EAC7BiI,aAAsB,SACxB,MAAMA,EAERX,EAAK,SAAW,EAClB,OAASrI,EAAO,CACdiJ,EAAYjJ,EACZ,QAAQ,MAAM,8BAA8BQ,CAAK,UAAU6H,EAAK,IAAI,KAAMrI,CAAK,EAE3EQ,IAAU,SACZ,MAAM,KAAK,aAAa,CAAE,MAAAA,EAAO,KAAM6H,EAAK,KAAM,MAAArI,EAAO,KAAAe,CAAI,CAAE,CAEnE,CAEA,MAAMmI,EAAe,YAAY,IAAG,EAAKH,EAEzC,KAAK,MAAM,KAAK,CACd,OAAAF,EACA,MAAArI,EACA,SAAU6H,EAAK,KACf,SAAUa,EACV,OAAQD,EAAY,QAAU,UAC9B,MAAOA,EAAYA,EAAU,QAAU,KACvC,UAAW,KAAK,IAAG,CAC7B,CAAS,CACH,CAEA,MAAME,EAAgB,YAAY,IAAG,EAAKL,EAC1C,QAAQ,MAAM,qBAAqBtI,CAAK,iBAAiB2I,EAAc,QAAQ,CAAC,CAAC,OAAO,KAAK,KAAK,GAAG,CACvG,QAAC,CACC,KAAK,aAAa,OAAON,CAAM,CACjC,CACF,CAEA,MAAM,SAASrI,KAAUO,EAAM,CAC7B,GAAI,CAAC,KAAK,WAAW,SAASP,CAAK,EACjC,MAAM,IAAI,MAAM,uBAAuBA,CAAK,EAAE,EAGhD,MAAM4I,EAAW,KAAK,cAAc5I,CAAK,EACzC,GAAI4I,GACF,GAAI,MAAM,QAAQA,EAAS,IAAI,GAC7B,GAAI,CAACA,EAAS,KAAK,SAAS,KAAK,KAAK,EACpC,MAAM,IAAI,MAAM,UAAU5I,CAAK,eAAe,KAAK,KAAK,sBAAsB4I,EAAS,KAAK,KAAK,IAAI,CAAC,EAAE,UAGtG,KAAK,QAAUA,EAAS,KAC1B,MAAM,IAAI,MAAM,UAAU5I,CAAK,eAAe,KAAK,KAAK,cAAc4I,EAAS,IAAI,EAAE,EAK3F,MAAMC,EAAc,SAAS7I,EAAM,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAM,MAAM,CAAC,CAAC,GACrE8I,EAAa,QAAQ9I,EAAM,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAM,MAAM,CAAC,CAAC,GAEzE,KAAK,eAAe6I,CAAW,EAC/B,KAAK,eAAe7I,CAAK,EACzB,KAAK,eAAe8I,CAAU,EAE1B,KAAK,UAAU,SAASD,CAAW,GACrC,MAAM,KAAK,KAAKA,EAAa,GAAGtI,CAAI,EAGtC,MAAM,KAAK,KAAKP,EAAO,GAAGO,CAAI,EAE1BqI,GACF,KAAK,aAAaA,EAAS,EAAE,EAG3B,KAAK,UAAU,SAASE,CAAU,GACpC,MAAM,KAAK,KAAKA,EAAY,GAAGvI,CAAI,CAEvC,CAEA,MAAM,aAAaA,EAAM,CACvB,MAAM,KAAK,SAAS,YAAa,GAAGA,CAAI,CAC1C,CAEA,MAAM,kBAAmB,CACvB,OAAO,IAAI,QAAS8C,GAAY,CAC9B,GAAI,SAAS,aAAe,YAAc,SAAS,aAAe,cAAe,CAC/EA,IACA,MACF,CAEA,MAAM0F,EAAU,IAAM,CACpB,SAAS,oBAAoB,mBAAoBA,CAAO,EACxD,OAAO,oBAAoB,OAAQA,CAAO,EAC1C1F,GACF,EAEA,SAAS,iBAAiB,mBAAoB0F,CAAO,EACrD,OAAO,iBAAiB,OAAQA,CAAO,CACzC,CAAC,CACH,CAEA,MAAM,SAASxI,EAAM,CACnB,MAAM,KAAK,SAAS,QAAS,GAAGA,CAAI,CACtC,CAEA,MAAM,qBAAqBA,EAAM,CAC/B,MAAM,KAAK,mBACX,MAAM,KAAK,SAAS,QAAS,GAAGA,CAAI,CACtC,CAEA,MAAM,UAAUA,EAAM,CACpB,MAAM,KAAK,SAAS,SAAU,GAAGA,CAAI,CACvC,CAEA,MAAM,WAAWA,EAAM,CACrB,MAAM,KAAK,SAAS,UAAW,GAAGA,CAAI,CACxC,CAEA,MAAM,WAAWA,EAAM,CACrB,MAAM,KAAK,SAAS,UAAW,GAAGA,CAAI,EAEtC,KAAK,MAAM,QAAQqH,GAAY,CAC7BA,EAAS,OAAS,CACpB,CAAC,CACH,CAEA,iBAAiB5H,EAAO,CACtB,OAAO,KAAK,MAAM,IAAIA,CAAK,GAAK,CAAA,CAClC,CAEA,YAAYA,EAAO,CACjB,MAAM4H,EAAW,KAAK,MAAM,IAAI5H,CAAK,EACrC,OAAO4H,GAAYA,EAAS,OAAS,CACvC,CAEA,UAAW,CACT,MAAO,CAAC,GAAG,KAAK,KAAK,CACvB,CAEA,YAAa,CACX,KAAK,MAAQ,EACf,CAEA,UAAW,CACT,OAAO,KAAK,KACd,CAEA,iBAAkB,CAChB,MAAO,CAAC,GAAG,KAAK,YAAY,CAC9B,CAEA,UAAUoB,EAAa,CACrB,OAAO,KAAK,QAAUA,CACxB,CAEA,QAAQ7J,EAAS,CACf,YAAK,iBAAmBA,EACjB,KAAK,GAAG,QAASA,CAAO,CACjC,CAEA,iBAAiB8J,EAAU,CACzB,YAAK,cAAgBA,EACd,KAAK,GAAG,gBAAkBhJ,GAC3B,OAAOgJ,GAAa,WACfA,EAAShJ,CAAS,EAEpB,IACR,CACH,CAEA,aAAaiJ,EAAK,CAChB,KAAK,UAAYA,CACnB,CAEA,eAAgB,CACd,OAAO,KAAK,UACd,CAEA,cAAe,CACb,OAAO,KAAK,SACd,CAEA,iBAAkB,CAChB,KAAK,WAAa,EAClB,KAAK,UAAY,IACnB,CAEA,MAAM,aAAajJ,EAAW,CAI5B,GAHA,KAAK,aACL,KAAK,UAAYA,EAAU,MAEvB,KAAK,YAAc,KAAK,UAAW,CACrC,QAAQ,MAAM,0CAA0C,KAAK,SAAS,4BAA4B,EAClG,MACF,CAIA,GAFA,MAAM,KAAK,KAAK,QAASA,CAAS,EAE9B,OAAO,KAAK,kBAAqB,WACnC,GAAI,CACF,MAAM,KAAK,iBAAiBA,CAAS,CACvC,OAASb,EAAG,CACV,QAAQ,MAAM,+CAAgDA,CAAC,CACjE,CAGF,MAAM+J,EAAmB,KAAK,MAAM,IAAI,eAAe,EACvD,GAAIA,GAAoBA,EAAiB,OAAS,EAChD,UAAWtB,KAAQsB,EACjB,GAAI,CACF,MAAMzJ,EAASmI,EAAK,QAAQ5H,CAAS,EAIrC,GAHIP,aAAkB,SACpB,MAAMA,EAEJA,IAAW,UAAW,CACxB,QAAQ,MAAM,0DAA0DmI,EAAK,IAAI,GAAG,EACpF,MACF,CACF,OAASzI,EAAG,CACV,QAAQ,MAAM,kDAAkDyI,EAAK,IAAI,KAAMzI,CAAC,CAClF,CAIJ,QAAQ,MAAM,wCAAwCa,EAAU,KAAK,IAAKA,EAAU,KAAK,CAC3F,CACF,EAEAmJ,GAAA,KAA0B,CACxB,aAAc,CACZ,KAAK,QAAU,IAAI,IACnB,KAAK,eAAiB,IAAI,IAC1B,KAAK,YAAc,IAAI,GACzB,CAEA,SAASxK,EAAMyK,EAAQ,CACjB,KAAK,QAAQ,IAAIzK,CAAI,GACvB,QAAQ,KAAK,UAAUA,CAAI,iCAAiC,EAG9D,KAAK,QAAQ,IAAIA,EAAM,CACrB,GAAGyK,EACH,KAAAzK,EACA,QAAS,GACT,SAAU,KACV,UAAW,IAAI0K,EAAgB,UAAU1K,CAAI,EAAE,CACrD,CAAK,CACH,CAEA,MAAM,OAAOA,EAAM,CACjB,MAAMyK,EAAS,KAAK,QAAQ,IAAIzK,CAAI,EACpC,GAAI,CAACyK,EACH,MAAM,IAAI,MAAM,UAAUzK,CAAI,YAAY,EAG5C,GAAI,CAAAyK,EAAO,QAEX,GAAI,CACF,MAAMA,EAAO,UAAU,YAEnBA,EAAO,UACTA,EAAO,SAAW,MAAMA,EAAO,QAAO,GAExCA,EAAO,QAAU,GACjB,KAAK,eAAe,IAAIzK,CAAI,EAE5B,MAAMyK,EAAO,UAAU,QAEnBA,EAAO,OACT,KAAK,qBAAqBzK,EAAMyK,EAAO,KAAK,EAG9C,QAAQ,IAAI,UAAUzK,CAAI,UAAU,CACtC,OAASY,EAAO,CACd,cAAQ,MAAM,2BAA2BZ,CAAI,IAAKY,CAAK,EACjDA,CACR,CACF,CAEA,MAAM,QAAQZ,EAAM,CAClB,MAAMyK,EAAS,KAAK,QAAQ,IAAIzK,CAAI,EACpC,GAAI,GAACyK,GAAU,CAACA,EAAO,SAEvB,GAAI,CACF,MAAMA,EAAO,UAAU,UAEnBA,EAAO,WACT,MAAMA,EAAO,UAAUA,EAAO,QAAQ,EAGpCA,EAAO,OACT,KAAK,uBAAuBzK,CAAI,EAGlCyK,EAAO,QAAU,GACjB,KAAK,eAAe,OAAOzK,CAAI,EAC/ByK,EAAO,SAAW,KAElB,MAAMA,EAAO,UAAU,UAEvB,QAAQ,IAAI,UAAUzK,CAAI,WAAW,CACvC,OAASY,EAAO,CACd,cAAQ,MAAM,4BAA4BZ,CAAI,IAAKY,CAAK,EAClDA,CACR,CACF,CAEA,IAAIZ,EAAM,CAER,OADe,KAAK,QAAQ,IAAIA,CAAI,GACrB,UAAY,IAC7B,CAEA,QAAS,CACP,MAAMc,EAAS,CAAA,EACf,YAAK,QAAQ,QAAQ,CAAC2J,EAAQzK,IAAS,CACrCc,EAAOd,CAAI,EAAI,CACb,KAAMyK,EAAO,KACb,QAASA,EAAO,QAChB,SAAUA,EAAO,SACjB,MAAOA,EAAO,UAAU,SAAQ,CACxC,CACI,CAAC,EACM3J,CACT,CAEA,YAAa,CACX,MAAMA,EAAS,CAAA,EACf,YAAK,eAAe,QAAQd,GAAQ,CAClC,MAAMyK,EAAS,KAAK,QAAQ,IAAIzK,CAAI,EAChCyK,IACF3J,EAAOd,CAAI,EAAIyK,EAAO,SAE1B,CAAC,EACM3J,CACT,CAEA,MAAM,WAAY,CAChB,MAAMsB,EAAW,CAAA,EACjB,KAAK,QAAQ,QAAQ,CAAC4D,EAAGhG,IAAS,CAChCoC,EAAS,KAAK,KAAK,OAAOpC,CAAI,CAAC,CACjC,CAAC,EACD,MAAM,QAAQ,IAAIoC,CAAQ,CAC5B,CAEA,MAAM,YAAa,CACjB,MAAMA,EAAW,CAAA,EACjB,KAAK,eAAe,QAAQpC,GAAQ,CAClCoC,EAAS,KAAK,KAAK,QAAQpC,CAAI,CAAC,CAClC,CAAC,EACD,MAAM,QAAQ,IAAIoC,CAAQ,CAC5B,CAEA,qBAAqBuI,EAAYzB,EAAO,CACjC,KAAK,YAAY,IAAIyB,CAAU,GAClC,KAAK,YAAY,IAAIA,EAAY,CAAA,CAAE,EAGrC,MAAMC,EAAc,KAAK,YAAY,IAAID,CAAU,EAEnD,OAAO,KAAKzB,CAAK,EAAE,QAAQ9H,GAAS,CAClC,MAAMyJ,EAAc,OAAO,iBAAiB,GAAGzJ,EAAO8H,EAAM9H,CAAK,EAAG,CAAE,KAAM,GAAGuJ,CAAU,IAAIvJ,CAAK,EAAE,CAAE,EAClGyJ,GACFD,EAAY,KAAK,CAAE,MAAAxJ,EAAO,YAAAyJ,CAAW,CAAE,CAE3C,CAAC,CACH,CAEA,uBAAuBF,EAAY,CACjC,MAAMC,EAAc,KAAK,YAAY,IAAID,CAAU,EAC9CC,IAELA,EAAY,QAAQ,CAAC,CAAE,YAAAC,KAAkB,CACnCA,GAAaA,GACnB,CAAC,EAED,KAAK,YAAY,OAAOF,CAAU,EACpC,CACF,EAEA,MAAMG,GAAkB,IAAIJ,EAAgB,KAAK,EAC3CK,GAAsB,IAAIC,GAEhC,SAASC,GAAgBpC,EAAQ,MAAO,CACtC,OAAO,IAAI6B,EAAgB7B,CAAK,CAClC,CAEA,OAAO,gBAAkB6B,EACzB,OAAO,oBAAsBM,GAC7B,OAAO,gBAAkBF,GACzB,OAAO,oBAAsBC,GAC7B,OAAO,gBAAkBE,GC7fzB,MAAMC,GAAc,CAClB,OAAQ,CACN,KAAKC,EAAK,CACR,OAAOA,EAAMA,EAAI,KAAI,EAAK,EAC5B,EACA,SAASA,EAAK,CACZ,OAAOA,EAAMA,EAAI,QAAQ,OAAQ,EAAE,EAAI,EACzC,EACA,UAAUA,EAAK,CACb,OAAOA,EAAMA,EAAI,QAAQ,OAAQ,EAAE,EAAI,EACzC,EACA,YAAYA,EAAK,CACf,OAAOA,EAAMA,EAAI,YAAW,EAAK,EACnC,EACA,YAAYA,EAAK,CACf,OAAOA,EAAMA,EAAI,YAAW,EAAK,EACnC,EACA,WAAWA,EAAK,CACd,OAAKA,EACEA,EAAI,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAI,MAAM,CAAC,EAD/B,EAEnB,EACA,SAASA,EAAK,CACZ,OAAKA,EACEA,EAAI,QAAQ,SAAU,CAACnF,EAAGoF,IAAMA,EAAIA,EAAE,YAAW,EAAK,EAAE,EAD9C,EAEnB,EACA,UAAUD,EAAK,CACb,OAAKA,EACEA,EAAI,QAAQ,WAAY,KAAK,EAAE,YAAW,EAAG,QAAQ,KAAM,EAAE,EADnD,EAEnB,EACA,SAASA,EAAKE,EAAQC,EAAU,IAAK,CACnC,OAAQ,OAAOH,CAAG,GAAK,IAAI,SAASE,EAAQC,CAAO,CACrD,EACA,OAAOH,EAAKE,EAAQC,EAAU,IAAK,CACjC,OAAQ,OAAOH,CAAG,GAAK,IAAI,OAAOE,EAAQC,CAAO,CACnD,EACA,SAASH,EAAKI,EAAWC,EAAS,MAAO,CACvC,MAAI,CAACL,GAAOA,EAAI,QAAUI,EAAkBJ,GAAO,GAC5CA,EAAI,MAAM,EAAGI,CAAS,EAAIC,CACnC,EACA,WAAWL,EAAKtH,EAAQ4H,EAAa,CACnC,OAAKN,EACEA,EAAI,MAAMtH,CAAM,EAAE,KAAK4H,CAAW,EADxB,EAEnB,EACA,OAAOC,EAAUpL,EAAM,CACrB,OAAKoL,EACEA,EAAS,QAAQ,iBAAkB,CAAC1F,EAAGvE,IAAQnB,EAAKmB,CAAG,IAAM,OAAYnB,EAAKmB,CAAG,EAAI,KAAKA,CAAG,IAAI,EADlF,EAExB,EACA,WAAW0J,EAAKQ,EAAQ,CACtB,OAAQR,GAAO,IAAI,WAAWQ,CAAM,CACtC,EACA,SAASR,EAAKK,EAAQ,CACpB,OAAQL,GAAO,IAAI,SAASK,CAAM,CACpC,EACA,SAASL,EAAKtH,EAAQ,CACpB,OAAQsH,GAAO,IAAI,SAAStH,CAAM,CACpC,EACA,OAAOsH,EAAKS,EAAO,CACjB,OAAQT,GAAO,IAAI,OAAOS,CAAK,CACjC,EACA,QAAQT,EAAK,CACX,OAAQA,GAAO,IAAI,MAAM,EAAE,EAAE,QAAO,EAAG,KAAK,EAAE,CAChD,EACA,iBAAiBA,EAAKtH,EAAQ,CAC5B,MAAI,CAACsH,GAAO,CAACtH,EAAe,EACrBsH,EAAI,MAAMtH,CAAM,EAAE,OAAS,CACpC,EACA,WAAWsH,EAAK,CACd,GAAI,CAACA,EAAK,MAAO,GACjB,MAAMU,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAcV,EACXU,EAAI,SACb,EACA,aAAaV,EAAK,CAChB,GAAI,CAACA,EAAK,MAAO,GACjB,MAAMU,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,UAAYV,EACTU,EAAI,WACb,EACA,eAAeR,EAAS,EAAG,CACzB,MAAMS,EAAQ,iEACd,IAAIhL,EAAS,GACb,QAASiG,EAAI,EAAGA,EAAIsE,EAAQtE,IAC1BjG,GAAUgL,EAAM,OAAO,KAAK,MAAM,KAAK,SAAWA,EAAM,MAAM,CAAC,EAEjE,OAAOhL,CACT,EACA,cAAe,CACb,MAAO,uCAAuC,QAAQ,QAAUsK,GAAM,CACpE,MAAMW,EAAI,KAAK,OAAM,EAAK,GAAK,EAE/B,OADUX,IAAM,IAAMW,EAAKA,EAAI,EAAM,GAC5B,SAAS,EAAE,CACtB,CAAC,CACH,CACJ,EAEE,MAAO,CACL,QAAQC,EAAK,CACX,OAAO,MAAM,QAAQA,CAAG,CAC1B,EACA,QAAQA,EAAK,CACX,MAAO,CAACA,GAAOA,EAAI,SAAW,CAChC,EACA,KAAKA,EAAK,CACR,OAAOA,EAAMA,EAAI,OAAS,CAC5B,EACA,MAAMA,EAAKC,EAAc,CACvB,OAAOD,GAAOA,EAAI,OAAS,EAAIA,EAAI,CAAC,EAAIC,CAC1C,EACA,KAAKD,EAAKC,EAAc,CACtB,OAAOD,GAAOA,EAAI,OAAS,EAAIA,EAAIA,EAAI,OAAS,CAAC,EAAIC,CACvD,EACA,IAAID,EAAKrI,EAAOsI,EAAc,CAC5B,OAAOD,GAAOA,EAAIrI,CAAK,IAAM,OAAYqI,EAAIrI,CAAK,EAAIsI,CACxD,EACA,MAAMD,EAAK9E,EAAOC,EAAK,CACrB,OAAO6E,EAAMA,EAAI,MAAM9E,EAAOC,CAAG,EAAI,EACvC,EACA,UAAUxF,EAAM,CACd,OAAOA,EAAK,OAAO,CAACb,EAAQoL,IAAQpL,EAAO,OAAOoL,GAAO,EAAE,EAAG,CAAA,CAAE,CAClE,EACA,KAAKF,EAAKG,EAAY,IAAK,CACzB,OAAOH,EAAMA,EAAI,KAAKG,CAAS,EAAI,EACrC,EACA,QAAQH,EAAKI,EAAMC,EAAY,EAAG,CAChC,OAAOL,EAAMA,EAAI,QAAQI,EAAMC,CAAS,EAAI,EAC9C,EACA,YAAYL,EAAKI,EAAMC,EAAW,CAChC,OAAOL,EAAMA,EAAI,YAAYI,EAAMC,CAAS,EAAI,EAClD,EACA,SAASL,EAAKI,EAAM,CAClB,OAAOJ,EAAMA,EAAI,SAASI,CAAI,EAAI,EACpC,EACA,KAAKJ,KAAQM,EAAO,CAClB,OAAIN,GAAKA,EAAI,KAAK,GAAGM,CAAK,EACnBN,CACT,EACA,IAAIA,EAAK,CACP,OAAOA,EAAMA,EAAI,IAAG,EAAK,MAC3B,EACA,MAAMA,EAAK,CACT,OAAOA,EAAMA,EAAI,MAAK,EAAK,MAC7B,EACA,QAAQA,KAAQM,EAAO,CACrB,OAAIN,GAAKA,EAAI,QAAQ,GAAGM,CAAK,EACtBN,CACT,EACA,OAAOA,EAAKI,EAAM,CAChB,GAAI,CAACJ,EAAK,OAAOA,EACjB,MAAMrI,EAAQqI,EAAI,QAAQI,CAAI,EAC9B,OAAIzI,EAAQ,IAAIqI,EAAI,OAAOrI,EAAO,CAAC,EAC5BqI,CACT,EACA,SAASA,EAAKrI,EAAO,CACnB,MAAI,CAACqI,GAAOrI,EAAQ,GAAKA,GAASqI,EAAI,QACtCA,EAAI,OAAOrI,EAAO,CAAC,EACZqI,CACT,EACA,OAAOA,EAAKrI,EAAOyI,EAAM,CACvB,OAAKJ,IACLA,EAAI,OAAOrI,EAAO,EAAGyI,CAAI,EAClBJ,EACT,EACA,QAAQA,EAAK,CACX,OAAOA,EAAMA,EAAI,MAAK,EAAG,QAAO,EAAK,CAAA,CACvC,EACA,KAAKA,EAAKO,EAAW,CACnB,OAAOP,EAAMA,EAAI,MAAK,EAAG,KAAKO,CAAS,EAAI,EAC7C,EACA,OAAOP,EAAKvK,EAAK+K,EAAQ,MAAO,CAC9B,OAAKR,EACEA,EAAI,MAAK,EAAG,KAAK,CAAC7C,EAAGC,IAAM,CAChC,MAAMqD,EAAO,OAAOtD,GAAM,SAAWA,EAAE1H,CAAG,EAAI0H,EACxCuD,EAAO,OAAOtD,GAAM,SAAWA,EAAE3H,CAAG,EAAI2H,EAC9C,OAAIqD,EAAOC,EAAaF,IAAU,MAAQ,GAAK,EAC3CC,EAAOC,EAAaF,IAAU,MAAQ,EAAI,GACvC,CACT,CAAC,EAPgB,EAQnB,EACA,OAAOR,EAAKW,EAAW,CACrB,OAAOX,EAAMA,EAAI,OAAOW,CAAS,EAAI,CAAA,CACvC,EACA,IAAIX,EAAKY,EAAI,CACX,OAAOZ,EAAMA,EAAI,IAAIY,CAAE,EAAI,CAAA,CAC7B,EACA,OAAOZ,EAAKY,EAAIC,EAAc,CAC5B,OAAOb,EAAMA,EAAI,OAAOY,EAAIC,CAAY,EAAIA,CAC9C,EACA,QAAQb,EAAKY,EAAI,CACXZ,GAAKA,EAAI,QAAQY,CAAE,CACzB,EACA,MAAMZ,EAAKW,EAAW,CACpB,OAAOX,EAAMA,EAAI,MAAMW,CAAS,EAAI,EACtC,EACA,KAAKX,EAAKW,EAAW,CACnB,OAAOX,EAAMA,EAAI,KAAKW,CAAS,EAAI,EACrC,EACA,KAAKX,EAAKW,EAAW,CACnB,OAAOX,EAAMA,EAAI,KAAKW,CAAS,EAAI,MACrC,EACA,UAAUX,EAAKW,EAAW,CACxB,OAAOX,EAAMA,EAAI,UAAUW,CAAS,EAAI,EAC1C,EACA,KAAKX,EAAKc,EAAQ,EAAG,CACnB,OAAOd,EAAMA,EAAI,KAAKc,CAAK,EAAI,CAAA,CACjC,EACA,YAAYd,EAAK,CACf,OAAOA,EAAMA,EAAI,OAAO,CAACe,EAAKX,IAC5B,MAAM,QAAQA,CAAI,EAAIW,EAAI,OAAO,KAAK,YAAYX,CAAI,CAAC,EAAIW,EAAI,OAAOX,CAAI,EAAG,CAAA,CAAE,EAAI,EACvF,EACA,OAAOJ,EAAK,CACV,OAAOA,EAAM,CAAC,GAAG,IAAI,IAAIA,CAAG,CAAC,EAAI,EACnC,EACA,SAASA,EAAKvK,EAAK,CACjB,GAAI,CAACuK,EAAK,MAAO,GACjB,MAAMgB,EAAO,IAAI,IACjB,OAAOhB,EAAI,OAAOI,GAAQ,CACxB,MAAMnM,EAAQ,OAAOmM,GAAS,SAAWA,EAAK3K,CAAG,EAAI2K,EACrD,OAAIY,EAAK,IAAI/M,CAAK,EAAU,IAC5B+M,EAAK,IAAI/M,CAAK,EACP,GACT,CAAC,CACH,EACA,MAAM+L,EAAKiB,EAAM,CACf,GAAI,CAACjB,GAAOiB,GAAQ,EAAG,MAAO,CAAA,EAC9B,MAAMC,EAAS,CAAA,EACf,QAASnG,EAAI,EAAGA,EAAIiF,EAAI,OAAQjF,GAAKkG,EACnCC,EAAO,KAAKlB,EAAI,MAAMjF,EAAGA,EAAIkG,CAAI,CAAC,EAEpC,OAAOC,CACT,EACA,QAAQlB,EAAK,CACX,GAAI,CAACA,EAAK,MAAO,GACjB,MAAMlL,EAASkL,EAAI,QACnB,QAASjF,EAAIjG,EAAO,OAAS,EAAGiG,EAAI,EAAGA,IAAK,CAC1C,MAAMoG,EAAI,KAAK,MAAM,KAAK,UAAYpG,EAAI,EAAE,EAC5C,CAACjG,EAAOiG,CAAC,EAAGjG,EAAOqM,CAAC,CAAC,EAAI,CAACrM,EAAOqM,CAAC,EAAGrM,EAAOiG,CAAC,CAAC,CAChD,CACA,OAAOjG,CACT,EACA,IAAIkL,EAAK,CACP,OAAOA,EAAMA,EAAI,OAAO,CAACe,EAAKK,IAAQL,GAAO,OAAOK,CAAG,GAAK,GAAI,CAAC,EAAI,CACvE,EACA,QAAQpB,EAAK,CACX,MAAI,CAACA,GAAOA,EAAI,SAAW,EAAU,EAC9B,KAAK,IAAIA,CAAG,EAAIA,EAAI,MAC7B,EACA,IAAIA,EAAK,CACP,OAAOA,GAAOA,EAAI,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAG,EAAI,IACpD,EACA,IAAIA,EAAK,CACP,OAAOA,GAAOA,EAAI,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAG,EAAI,GACpD,EACA,gBAAgBrK,EAAM,CACpB,OAAIA,EAAK,SAAW,EAAU,CAAA,EACvBA,EAAK,OAAO,CAACb,EAAQkL,IAC1BlL,EAAO,OAAOsL,GAAQJ,GAAOA,EAAI,SAASI,CAAI,CAAC,CAAC,CACpD,EACA,SAASzK,EAAM,CACb,MAAO,CAAC,GAAG,IAAI,IAAIA,EAAK,KAAI,EAAG,OAAO,OAAO,CAAC,CAAC,CACjD,EACA,WAAW0L,EAAMC,EAAM,CACrB,OAAOD,EAAOA,EAAK,OAAOjB,GAAQ,CAACkB,GAAQ,CAACA,EAAK,SAASlB,CAAI,CAAC,EAAI,CAAA,CACrE,EACA,OAAOzK,EAAM,CACX,GAAIA,EAAK,SAAW,EAAG,MAAO,CAAA,EAC9B,MAAM4J,EAAY,KAAK,IAAI,GAAG5J,EAAK,IAAIqK,GAAOA,EAAMA,EAAI,OAAS,CAAC,CAAC,EACnE,OAAO,MAAM,KAAK,CAAE,OAAQT,CAAS,EAAI,CAACvF,EAAGe,IAC3CpF,EAAK,IAAIqK,GAAOA,GAAOA,EAAIjF,CAAC,CAAC,CAAC,CAClC,CACJ,EAEE,OAAQ,CACN,SAASwG,EAAK,CACZ,OAAOA,IAAQ,MAAQ,OAAOA,GAAQ,UAAY,CAAC,MAAM,QAAQA,CAAG,CACtE,EACA,QAAQA,EAAK,CACX,MAAI,CAACA,GAAO,OAAOA,GAAQ,SAAiB,GACrC,OAAO,KAAKA,CAAG,EAAE,SAAW,CACrC,EACA,KAAKA,EAAK,CACR,OAAOA,EAAM,OAAO,KAAKA,CAAG,EAAI,CAAA,CAClC,EACA,OAAOA,EAAK,CACV,OAAOA,EAAM,OAAO,OAAOA,CAAG,EAAI,CAAA,CACpC,EACA,QAAQA,EAAK,CACX,OAAOA,EAAM,OAAO,QAAQA,CAAG,EAAI,CAAA,CACrC,EACA,IAAIA,EAAK9L,EAAK,CACZ,OAAO8L,EAAM,OAAO,UAAU,eAAe,KAAKA,EAAK9L,CAAG,EAAI,EAChE,EACA,IAAI8L,EAAKlK,EAAM4I,EAAc,CAC3B,OAAKsB,GACQlK,EAAK,MAAM,GAAG,EACf,OAAO,CAACmK,EAAS/L,IAAQ+L,GAAWA,EAAQ/L,CAAG,EAAG8L,CAAG,GAAKtB,CACxE,EACA,IAAIsB,EAAKlK,EAAMpD,EAAO,CACpB,GAAI,CAACsN,GAAO,OAAOA,GAAQ,SAAU,OAAOA,EAC5C,MAAME,EAAOpK,EAAK,MAAM,GAAG,EACrBqK,EAAUD,EAAK,MACrB,IAAID,EAAUD,EACd,OAAAE,EAAK,QAAQhM,GAAO,CACb+L,EAAQ/L,CAAG,IAAG+L,EAAQ/L,CAAG,EAAI,IAClC+L,EAAUA,EAAQ/L,CAAG,CACvB,CAAC,EACD+L,EAAQE,CAAO,EAAIzN,EACZsN,CACT,EACA,KAAKA,EAAKE,EAAM,CACd,OAAKF,EACEE,EAAK,OAAO,CAAC3M,EAAQW,KACtB8L,EAAI9L,CAAG,IAAM,SAAWX,EAAOW,CAAG,EAAI8L,EAAI9L,CAAG,GAC1CX,GACN,CAAA,CAAE,EAJY,EAKnB,EACA,KAAKyM,EAAKE,EAAM,CACd,OAAKF,EACE,OAAO,KAAKA,CAAG,EAAE,OAAO,CAACzM,EAAQW,KACjCgM,EAAK,SAAShM,CAAG,IAAGX,EAAOW,CAAG,EAAI8L,EAAI9L,CAAG,GACvCX,GACN,CAAA,CAAE,EAJY,EAKnB,EACA,SAASa,EAAM,CACb,OAAOA,EAAK,OAAO,CAACb,EAAQyM,KACtBA,GAAO,OAAOA,GAAQ,UACxB,OAAO,KAAKA,CAAG,EAAE,QAAQ9L,GAAO,CAC1B,KAAK,SAAS8L,EAAI9L,CAAG,CAAC,GAAK,KAAK,SAASX,EAAOW,CAAG,CAAC,EACtDX,EAAOW,CAAG,EAAI,KAAK,MAAMX,EAAOW,CAAG,EAAG8L,EAAI9L,CAAG,CAAC,EAE9CX,EAAOW,CAAG,EAAI8L,EAAI9L,CAAG,CAEzB,CAAC,EAEIX,GACN,CAAA,CAAE,CACP,EACA,MAAMyM,EAAK,CACT,OAAOA,GAAM,KAAK,MAAM,KAAK,UAAUA,CAAG,CAAC,CAC7C,EACA,UAAUA,EAAKhG,EAAO,IAAI,QAAW,CACnC,GAAI,CAACgG,GAAO,OAAOA,GAAQ,SAAU,OAAOA,EAC5C,GAAIhG,EAAK,IAAIgG,CAAG,EAAG,OAAOhG,EAAK,IAAIgG,CAAG,EACtC,GAAIA,aAAe,KAAM,OAAO,IAAI,KAAKA,CAAG,EAC5C,GAAIA,aAAe,OAAQ,OAAO,IAAI,OAAOA,CAAG,EAChD,GAAIA,aAAe,IAAK,CACtB,MAAMI,EAAM,IAAI,IAChB,OAAApG,EAAK,IAAIgG,EAAKI,CAAG,EACjBJ,EAAI,QAAQ,CAACH,EAAK3L,IAAQkM,EAAI,IAAIlM,EAAK,KAAK,UAAU2L,EAAK7F,CAAI,CAAC,CAAC,EAC1DoG,CACT,CACA,GAAIJ,aAAe,IAAK,CACtB,MAAMK,EAAM,IAAI,IAChB,OAAArG,EAAK,IAAIgG,EAAKK,CAAG,EACjBL,EAAI,QAAQH,GAAOQ,EAAI,IAAI,KAAK,UAAUR,EAAK7F,CAAI,CAAC,CAAC,EAC9CqG,CACT,CACA,GAAI,MAAM,QAAQL,CAAG,EAAG,CACtB,MAAMvB,EAAM,CAAA,EACZ,OAAAzE,EAAK,IAAIgG,EAAKvB,CAAG,EACjBuB,EAAI,QAAQnB,GAAQJ,EAAI,KAAK,KAAK,UAAUI,EAAM7E,CAAI,CAAC,CAAC,EACjDyE,CACT,CACA,MAAM6B,EAAQ,CAAA,EACd,OAAAtG,EAAK,IAAIgG,EAAKM,CAAK,EACnB,OAAO,KAAKN,CAAG,EAAE,QAAQ9L,GAAO,CAC9BoM,EAAMpM,CAAG,EAAI,KAAK,UAAU8L,EAAI9L,CAAG,EAAG8F,CAAI,CAC5C,CAAC,EACMsG,CACT,EACA,QAAQN,EAAKX,EAAI,CACVW,GACL,OAAO,KAAKA,CAAG,EAAE,QAAQ9L,GAAOmL,EAAGW,EAAI9L,CAAG,EAAGA,EAAK8L,CAAG,CAAC,CACxD,EACA,IAAIA,EAAKX,EAAI,CACX,GAAI,CAACW,EAAK,MAAO,GACjB,MAAMzM,EAAS,CAAA,EACf,cAAO,KAAKyM,CAAG,EAAE,QAAQ9L,GAAO,CAC9BX,EAAOW,CAAG,EAAImL,EAAGW,EAAI9L,CAAG,EAAGA,EAAK8L,CAAG,CACrC,CAAC,EACMzM,CACT,EACA,OAAOyM,EAAKX,EAAI,CACd,GAAI,CAACW,EAAK,MAAO,GACjB,MAAMzM,EAAS,CAAA,EACf,cAAO,KAAKyM,CAAG,EAAE,QAAQ9L,GAAO,CAC1BmL,EAAGW,EAAI9L,CAAG,EAAGA,EAAK8L,CAAG,IAAGzM,EAAOW,CAAG,EAAI8L,EAAI9L,CAAG,EACnD,CAAC,EACMX,CACT,EACA,OAAOyM,EAAKX,EAAIC,EAAc,CAC5B,OAAKU,EACE,OAAO,KAAKA,CAAG,EAAE,OAAO,CAACR,EAAKtL,IACnCmL,EAAGG,EAAKQ,EAAI9L,CAAG,EAAGA,EAAK8L,CAAG,EAAGV,CAAY,EAF1BA,CAGnB,EACA,QAAQU,EAAK,CACX,OAAKA,EACE,OAAO,KAAKA,CAAG,EAAE,IAAI9L,IAAQ,CAAE,IAAAA,EAAK,MAAO8L,EAAI9L,CAAG,CAAC,EAAG,EAD5C,EAEnB,EACA,UAAUuK,EAAK8B,EAAUC,EAAY,CACnC,OAAK/B,EACEA,EAAI,OAAO,CAAClL,EAAQsL,IAAS,CAClC,MAAM3K,EAAM,OAAO2K,GAAS,SAAWA,EAAK0B,CAAQ,EAAI1B,EAClDnM,EAAQ8N,EAAa3B,EAAK2B,CAAU,EAAI3B,EAC9C,OAAI3K,IAAQ,SAAWX,EAAOW,CAAG,EAAIxB,GAC9Ba,CACT,EAAG,CAAA,CAAE,EANY,EAOnB,EACA,KAAKyM,EAAK,CACR,OAAOA,EAAM,OAAO,KAAKA,CAAG,EAAE,OAAS,CACzC,EACA,OAAOA,EAAK,CACV,GAAI,CAACA,EAAK,MAAO,GACjB,MAAMzM,EAAS,CAAA,EACf,cAAO,KAAKyM,CAAG,EAAE,QAAQ9L,GAAO,CAC9BX,EAAOyM,EAAI9L,CAAG,CAAC,EAAIA,CACrB,CAAC,EACMX,CACT,EACA,QAAQkN,EAAMC,EAAM,CAClB,GAAID,IAASC,EAAM,MAAO,GAC1B,GAAI,CAACD,GAAQ,CAACC,GAAQ,OAAOD,GAAS,UAAY,OAAOC,GAAS,SAAU,MAAO,GACnF,MAAMC,EAAQ,OAAO,KAAKF,CAAI,EACxBG,EAAQ,OAAO,KAAKF,CAAI,EAC9B,OAAIC,EAAM,SAAWC,EAAM,OAAe,GACnCD,EAAM,MAAMzM,GAAO,KAAK,QAAQuM,EAAKvM,CAAG,EAAGwM,EAAKxM,CAAG,CAAC,CAAC,CAC9D,EACA,OAAO8L,EAAK,CACV,OAAKA,IACL,OAAO,OAAOA,CAAG,EACjB,OAAO,KAAKA,CAAG,EAAE,QAAQ9L,GAAO,CAC1B,OAAO8L,EAAI9L,CAAG,GAAM,UAAU,KAAK,OAAO8L,EAAI9L,CAAG,CAAC,CACxD,CAAC,EACM8L,EACT,EACA,KAAKA,EAAK,CACR,OAAOA,GAAM,OAAO,KAAKA,CAAG,CAC9B,CACJ,EAEE,OAAQ,CACN,SAASH,EAAK,CACZ,OAAO,OAAOA,GAAQ,UAAY,CAAC,MAAMA,CAAG,CAC9C,EACA,UAAUA,EAAK,CACb,OAAO,OAAO,UAAUA,CAAG,CAC7B,EACA,QAAQA,EAAK,CACX,OAAO,KAAK,SAASA,CAAG,GAAK,CAAC,OAAO,UAAUA,CAAG,CACpD,EACA,WAAWA,EAAK,CACd,OAAO,KAAK,SAASA,CAAG,GAAKA,EAAM,CACrC,EACA,WAAWA,EAAK,CACd,OAAO,KAAK,SAASA,CAAG,GAAKA,EAAM,CACrC,EACA,OAAOA,EAAK,CACV,OAAO,KAAK,SAASA,CAAG,GAAKA,IAAQ,CACvC,EACA,MAAMA,EAAKgB,EAAK9D,EAAK,CACnB,OAAK,KAAK,SAAS8C,CAAG,EACf,KAAK,IAAI,KAAK,IAAIA,EAAKgB,CAAG,EAAG9D,CAAG,EADP8C,CAElC,EACA,MAAMA,EAAKiB,EAAY,EAAG,CACxB,GAAI,CAAC,KAAK,SAASjB,CAAG,EAAG,OAAOA,EAChC,MAAMkB,EAAS,KAAK,IAAI,GAAID,CAAS,EACrC,OAAO,KAAK,MAAMjB,EAAMkB,CAAM,EAAIA,CACpC,EACA,MAAMlB,EAAK,CACT,OAAO,KAAK,SAASA,CAAG,EAAI,KAAK,MAAMA,CAAG,EAAIA,CAChD,EACA,KAAKA,EAAK,CACR,OAAO,KAAK,SAASA,CAAG,EAAI,KAAK,KAAKA,CAAG,EAAIA,CAC/C,EACA,IAAIA,EAAK,CACP,OAAO,KAAK,SAASA,CAAG,EAAI,KAAK,IAAIA,CAAG,EAAIA,CAC9C,EACA,OAAOzL,EAAM,CACX,MAAM4M,EAAO5M,EAAK,OAAO,KAAK,QAAQ,EACtC,OAAO4M,EAAK,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAI,EAAI,MAC/C,EACA,OAAO5M,EAAM,CACX,MAAM4M,EAAO5M,EAAK,OAAO,KAAK,QAAQ,EACtC,OAAO4M,EAAK,OAAS,EAAI,KAAK,IAAI,GAAGA,CAAI,EAAI,MAC/C,EACA,OAAO5M,EAAM,CAEX,OADaA,EAAK,KAAI,EAAG,OAAO,KAAK,QAAQ,EACjC,OAAO,CAACoL,EAAKK,IAAQL,EAAMK,EAAK,CAAC,CAC/C,EACA,WAAWzL,EAAM,CACf,MAAM4M,EAAO5M,EAAK,KAAI,EAAG,OAAO,KAAK,QAAQ,EAC7C,OAAO4M,EAAK,OAAS,EAAI,KAAK,IAAIA,CAAI,EAAIA,EAAK,OAAS,CAC1D,EACA,OAAOH,EAAM,EAAG9D,EAAM,EAAG,CACvB,OAAO,KAAK,OAAM,GAAMA,EAAM8D,GAAOA,CACvC,EACA,UAAUA,EAAK9D,EAAK,CAClB,OAAO,KAAK,MAAM,KAAK,OAAO8D,EAAK9D,EAAM,CAAC,CAAC,CAC7C,EACA,OAAO8C,EAAKoB,EAAW,EAAG,CACxB,OAAK,KAAK,SAASpB,CAAG,EACfA,EAAI,QAAQoB,CAAQ,EADK,OAAOpB,CAAG,CAE5C,EACA,eAAeA,EAAKqB,EAAW,MAAOD,EAAW,EAAG,CAClD,OAAK,KAAK,SAASpB,CAAG,EACJ,IAAI,KAAK,aAAa,QAAS,CAC/C,MAAO,WACP,SAAAqB,EACA,sBAAuBD,EACvB,sBAAuBA,CAC/B,CAAO,EACgB,OAAOpB,CAAG,EAPK,OAAOA,CAAG,CAQ5C,EACA,cAAcA,EAAKoB,EAAW,EAAG,CAC/B,OAAK,KAAK,SAASpB,CAAG,EACf,IAAIA,EAAM,KAAK,QAAQoB,CAAQ,CAAC,IADP,OAAOpB,CAAG,CAE5C,EACA,QAAQA,EAAKoB,EAAW,EAAG,CACzB,OAAK,KAAK,SAASpB,CAAG,EACfA,EAAI,QAAQoB,CAAQ,EADK,OAAOpB,CAAG,CAE5C,EACA,YAAYA,EAAKiB,EAAY,EAAG,CAC9B,OAAK,KAAK,SAASjB,CAAG,EACfA,EAAI,YAAYiB,CAAS,EADA,OAAOjB,CAAG,CAE5C,EACA,MAAMA,EAAK,CACT,OAAO,OAAO,MAAMA,CAAG,CACzB,EACA,SAASA,EAAK,CACZ,OAAO,OAAO,SAASA,CAAG,CAC5B,EACA,SAASA,EAAKsB,EAAQ,GAAI,CACxB,OAAO,OAAO,SAAStB,EAAKsB,CAAK,CACnC,EACA,WAAWtB,EAAK,CACd,OAAO,OAAO,WAAWA,CAAG,CAC9B,EACA,SAASA,EAAKnB,EAAe,EAAG,CAC9B,MAAM0C,EAAM,OAAOvB,CAAG,EACtB,OAAO,MAAMuB,CAAG,EAAI1C,EAAe0C,CACrC,EACA,WAAWxF,EAAGC,EAAG6C,EAAe,EAAG,CACjC,MAAI,CAAC,KAAK,SAAS9C,CAAC,GAAK,CAAC,KAAK,SAASC,CAAC,GAAKA,IAAM,EAAU6C,EACvD9C,EAAIC,CACb,EACA,gBAAgBzH,EAAM,CACpB,OAAOA,EAAK,OAAO,CAACb,EAAQsM,IACtB,CAAC,KAAK,SAAStM,CAAM,GAAK,CAAC,KAAK,SAASsM,CAAG,EAAU,EACnDtM,EAASsM,EACf,CAAC,CACN,CACJ,EAEE,KAAM,CACJ,KAAM,CACJ,OAAO,KAAK,KACd,EACA,OAAQ,CACN,MAAMwB,EAAM,IAAI,KAChB,OAAAA,EAAI,SAAS,EAAG,EAAG,EAAG,CAAC,EAChBA,CACT,EACA,UAAW,CACT,MAAMC,EAAO,KAAK,QAClB,OAAAA,EAAK,QAAQA,EAAK,QAAO,EAAK,CAAC,EACxBA,CACT,EACA,WAAY,CACV,MAAMA,EAAO,KAAK,QAClB,OAAAA,EAAK,QAAQA,EAAK,QAAO,EAAK,CAAC,EACxBA,CACT,EACA,OAAOzB,EAAK,CACV,OAAOA,aAAe,MAAQ,CAAC,MAAMA,EAAI,QAAO,CAAE,CACpD,EACA,QAAQyB,EAAM,CACZ,OAAO,KAAK,OAAOA,CAAI,CACzB,EACA,MAAM1D,EAAK,CACT,MAAM0D,EAAO,IAAI,KAAK1D,CAAG,EACzB,OAAO,KAAK,QAAQ0D,CAAI,EAAIA,EAAO,IACrC,EACA,OAAOA,EAAMC,EAAY,sBAAuB,CAC9C,GAAI,CAAC,KAAK,OAAOD,CAAI,EAAG,MAAO,GAC/B,MAAME,EAAOF,EAAK,cACZG,EAAQ,OAAOH,EAAK,SAAQ,EAAK,CAAC,EAAE,SAAS,EAAG,GAAG,EACnDI,EAAM,OAAOJ,EAAK,QAAO,CAAE,EAAE,SAAS,EAAG,GAAG,EAC5CK,EAAQ,OAAOL,EAAK,SAAQ,CAAE,EAAE,SAAS,EAAG,GAAG,EAC/CM,EAAU,OAAON,EAAK,WAAU,CAAE,EAAE,SAAS,EAAG,GAAG,EACnDO,EAAU,OAAOP,EAAK,WAAU,CAAE,EAAE,SAAS,EAAG,GAAG,EACnDQ,EAAe,OAAOR,EAAK,gBAAe,CAAE,EAAE,SAAS,EAAG,GAAG,EAE7DS,EADW,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC1BT,EAAK,OAAM,CAAE,EAEtC,OAAOC,EACJ,QAAQ,OAAQC,CAAI,EACpB,QAAQ,KAAMC,CAAK,EACnB,QAAQ,KAAMC,CAAG,EACjB,QAAQ,KAAMC,CAAK,EACnB,QAAQ,KAAMC,CAAO,EACrB,QAAQ,KAAMC,CAAO,EACrB,QAAQ,MAAOC,CAAY,EAC3B,QAAQ,IAAKR,EAAK,SAAS,EAC3B,QAAQ,IAAKA,EAAK,SAAQ,EAAK,CAAC,EAChC,QAAQ,IAAKA,EAAK,UAAU,EAC5B,QAAQ,IAAKA,EAAK,YAAY,EAC9B,QAAQ,IAAKA,EAAK,YAAY,EAC9B,QAAQ,IAAKS,CAAO,CACzB,EACA,MAAMT,EAAM,CACV,OAAO,KAAK,OAAOA,CAAI,EAAIA,EAAK,YAAW,EAAK,EAClD,EACA,MAAMA,EAAM,CACV,OAAO,KAAK,OAAOA,CAAI,EAAI,IAAI,KAAKA,EAAK,aAAa,EAAI,IAC5D,EACA,QAAQA,EAAMU,EAAM,CAClB,GAAI,CAAC,KAAK,OAAOV,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EAC7B,OAAAW,EAAQ,QAAQA,EAAQ,QAAO,EAAKD,CAAI,EACjCC,CACT,EACA,SAASX,EAAMK,EAAO,CACpB,GAAI,CAAC,KAAK,OAAOL,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EAC7B,OAAAW,EAAQ,SAASA,EAAQ,SAAQ,EAAKN,CAAK,EACpCM,CACT,EACA,WAAWX,EAAMM,EAAS,CACxB,GAAI,CAAC,KAAK,OAAON,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EAC7B,OAAAW,EAAQ,WAAWA,EAAQ,WAAU,EAAKL,CAAO,EAC1CK,CACT,EACA,WAAWX,EAAMO,EAAS,CACxB,GAAI,CAAC,KAAK,OAAOP,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EAC7B,OAAAW,EAAQ,WAAWA,EAAQ,WAAU,EAAKJ,CAAO,EAC1CI,CACT,EACA,SAASC,EAAOC,EAAO,CACrB,GAAI,CAAC,KAAK,OAAOD,CAAK,GAAK,CAAC,KAAK,OAAOC,CAAK,EAAG,MAAO,GACvD,MAAMC,EAAK,KAAK,QACVC,EAAK,KAAK,QAChB,OAAAD,EAAG,QAAQF,EAAM,QAAO,CAAE,EAC1BG,EAAG,QAAQF,EAAM,QAAO,CAAE,EACnB,KAAK,OAAOC,EAAG,QAAO,EAAKC,EAAG,QAAO,IAAO,IAAO,GAAK,GAAK,GAAG,CACzE,EACA,UAAUH,EAAOC,EAAO,CACtB,MAAI,CAAC,KAAK,OAAOD,CAAK,GAAK,CAAC,KAAK,OAAOC,CAAK,EAAU,EAChD,KAAK,OAAOD,EAAM,QAAO,EAAKC,EAAM,QAAO,IAAO,IAAO,GAAK,GAAG,CAC1E,EACA,YAAYD,EAAOC,EAAO,CACxB,MAAI,CAAC,KAAK,OAAOD,CAAK,GAAK,CAAC,KAAK,OAAOC,CAAK,EAAU,EAChD,KAAK,OAAOD,EAAM,QAAO,EAAKC,EAAM,QAAO,IAAO,IAAO,GAAG,CACrE,EACA,YAAYD,EAAOC,EAAO,CACxB,MAAI,CAAC,KAAK,OAAOD,CAAK,GAAK,CAAC,KAAK,OAAOC,CAAK,EAAU,EAChD,KAAK,OAAOD,EAAM,QAAO,EAAKC,EAAM,WAAa,GAAI,CAC9D,EACA,QAAQb,EAAM,CACZ,OAAK,KAAK,OAAOA,CAAI,EACd,KAAK,SAASA,EAAM,KAAK,MAAK,CAAE,IAAM,EADd,EAEjC,EACA,YAAYA,EAAM,CAChB,OAAK,KAAK,OAAOA,CAAI,EACd,KAAK,SAASA,EAAM,KAAK,MAAK,CAAE,IAAM,GADd,EAEjC,EACA,WAAWA,EAAM,CACf,OAAK,KAAK,OAAOA,CAAI,EACd,KAAK,SAASA,EAAM,KAAK,MAAK,CAAE,IAAM,EADd,EAEjC,EACA,SAASA,EAAM,CACb,OAAK,KAAK,OAAOA,CAAI,EACdA,EAAK,QAAO,EAAK,KAAK,IAAG,EADD,EAEjC,EACA,OAAOA,EAAM,CACX,OAAK,KAAK,OAAOA,CAAI,EACdA,EAAK,QAAO,EAAK,KAAK,IAAG,EADD,EAEjC,EACA,WAAWA,EAAM,CACf,GAAI,CAAC,KAAK,OAAOA,CAAI,EAAG,MAAO,GAC/B,MAAME,EAAOF,EAAK,cAClB,OAAOE,EAAO,IAAM,IAAMA,EAAO,MAAQ,GAAKA,EAAO,MAAQ,EAC/D,EACA,eAAeF,EAAM,CACnB,GAAI,CAAC,KAAK,OAAOA,CAAI,EAAG,MAAO,GAC/B,MAAME,EAAOF,EAAK,cACZG,EAAQH,EAAK,WACnB,OAAO,IAAI,KAAKE,EAAMC,EAAQ,EAAG,CAAC,EAAE,SACtC,EACA,cAAcH,EAAM,CAClB,GAAI,CAAC,KAAK,OAAOA,CAAI,EAAG,MAAO,GAC/B,MAAMgB,EAAc,IAAI,KAAKhB,EAAK,cAAe,EAAG,CAAC,EAC/CiB,EAAOjB,EAAK,QAAO,EAAKgB,EAAY,QAAO,EACjD,OAAO,KAAK,KAAKC,GAAQ,IAAO,GAAK,GAAK,GAAK,EAAE,CACnD,EACA,WAAWjB,EAAM,CACf,OAAK,KAAK,OAAOA,CAAI,EACd,KAAK,MAAMA,EAAK,WAAa,GAAK,CAAC,EADX,CAEjC,EACA,WAAWA,EAAM,CACf,GAAI,CAAC,KAAK,OAAOA,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EAC7B,OAAAW,EAAQ,SAAS,EAAG,EAAG,EAAG,CAAC,EACpBA,CACT,EACA,SAASX,EAAM,CACb,GAAI,CAAC,KAAK,OAAOA,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EAC7B,OAAAW,EAAQ,SAAS,GAAI,GAAI,GAAI,GAAG,EACzBA,CACT,EACA,aAAaX,EAAM,CACjB,OAAK,KAAK,OAAOA,CAAI,EACd,IAAI,KAAKA,EAAK,YAAW,EAAIA,EAAK,SAAQ,EAAI,CAAC,EADvBA,CAEjC,EACA,WAAWA,EAAM,CACf,OAAK,KAAK,OAAOA,CAAI,EACd,IAAI,KAAKA,EAAK,YAAW,EAAIA,EAAK,SAAQ,EAAK,EAAG,EAAG,GAAI,GAAI,GAAI,GAAG,EAD5CA,CAEjC,EACA,YAAYA,EAAMkB,EAAW,EAAG,CAC9B,GAAI,CAAC,KAAK,OAAOlB,CAAI,EAAG,OAAOA,EAC/B,MAAMW,EAAU,IAAI,KAAKX,CAAI,EACvBI,EAAMO,EAAQ,SACdM,EAAOb,GAAOc,EAAWd,EAAMc,EAAWd,GAAO,EAAIc,GAC3D,OAAAP,EAAQ,QAAQA,EAAQ,QAAO,EAAKM,CAAI,EACxCN,EAAQ,SAAS,EAAG,EAAG,EAAG,CAAC,EACpBA,CACT,EACA,UAAUX,EAAMkB,EAAW,EAAG,CAC5B,GAAI,CAAC,KAAK,OAAOlB,CAAI,EAAG,OAAOA,EAC/B,MAAM3H,EAAQ,KAAK,YAAY2H,EAAMkB,CAAQ,EACvC5I,EAAM,IAAI,KAAKD,CAAK,EAC1B,OAAAC,EAAI,QAAQA,EAAI,QAAO,EAAK,CAAC,EAC7BA,EAAI,SAAS,GAAI,GAAI,GAAI,GAAG,EACrBA,CACT,EACA,OAAO6I,EAAW,CAChB,GAAI,CAAC,KAAK,OAAOA,CAAS,EAAG,MAAO,GACpC,MAAMpB,EAAM,IAAI,KAChB,IAAIqB,EAAMrB,EAAI,YAAW,EAAKoB,EAAU,YAAW,EACnD,OAAIpB,EAAI,WAAaoB,EAAU,SAAQ,GAClCpB,EAAI,SAAQ,IAAOoB,EAAU,SAAQ,GAAMpB,EAAI,UAAYoB,EAAU,QAAO,IAC/EC,IAEK,KAAK,IAAI,EAAGA,CAAG,CACxB,EACA,QAAQpB,EAAM,CACZ,GAAI,CAAC,KAAK,OAAOA,CAAI,EAAG,MAAO,GAE/B,MAAMiB,EADM,KAAK,MACEjB,EAAK,QAAO,EACzBqB,EAAS,GAAK,IACdC,EAAO,GAAKD,EACZjB,EAAM,GAAKkB,EACXC,EAAO,EAAInB,EACXD,EAAQ,GAAKC,EACbF,EAAO,IAAME,EAEnB,OAAIa,EAAOI,EAAe,KACtBJ,EAAOK,EAAa,GAAG,KAAK,MAAML,EAAOI,CAAM,CAAC,MAChDJ,EAAOb,EAAY,GAAG,KAAK,MAAMa,EAAOK,CAAI,CAAC,MAC7CL,EAAOM,EAAa,GAAG,KAAK,MAAMN,EAAOb,CAAG,CAAC,KAC7Ca,EAAOd,EAAc,GAAG,KAAK,MAAMc,EAAOM,CAAI,CAAC,KAC/CN,EAAOf,EAAa,GAAG,KAAK,MAAMe,EAAOd,CAAK,CAAC,MAC5C,GAAG,KAAK,MAAMc,EAAOf,CAAI,CAAC,IACnC,CACJ,EAEE,SAASsB,EAAMC,EAAMvN,EAAU,CAAA,EAAI,CACjC,IAAIsC,EAAU,KACVkL,EAAW,KACXC,EAAW,KACXC,EAAe,EAEnB,MAAMC,EAAU3N,EAAQ,SAAW,GAC7B4N,EAAW5N,EAAQ,WAAa,GAEtC,SAAS6N,GAAa,CACpBP,EAAK,MAAMG,EAAUD,CAAQ,CAC/B,CAEA,SAASM,GAAc,CACrBJ,EAAe,KAAK,MAChBC,GACFrL,EAAU,WAAWyL,EAAcR,CAAI,EACvCM,KAEAvL,EAAU,WAAWyL,EAAcR,CAAI,CAE3C,CAEA,SAASQ,GAAe,CACtBzL,EAAU,KACNsL,GAAYJ,GACdK,IAEFL,EAAW,KACXC,EAAW,IACb,CAEA,SAASO,GAAgB,CACvB,MAAMC,EAAoB,KAAK,IAAG,EAAKP,EACvC,OAAO,KAAK,IAAI,EAAGH,EAAOU,CAAiB,CAC7C,CAEA,OAAO,YAAYrP,EAAM,CACvB4O,EAAW5O,EACX6O,EAAW,KACXC,EAAe,KAAK,MAEfpL,GAGH,aAAaA,CAAO,EACpBA,EAAU,WAAWyL,EAAcC,EAAa,CAAE,GAHlDF,GAKJ,CACF,EAEA,SAASR,EAAMY,EAAOlO,EAAU,CAAA,EAAI,CAClC,IAAImO,EAAa,GACjB,MAAMP,EAAW5N,EAAQ,UAAY,GACrC,IAAIwN,EAAW,KACXC,EAAW,KAEf,SAASI,GAAa,CACpBP,EAAK,MAAMG,EAAUD,CAAQ,EAC7BA,EAAW,KACXC,EAAW,IACb,CAEA,OAAO,YAAY7O,EAAM,CAClBuP,EAWMP,IACTJ,EAAW5O,EACX6O,EAAW,OAZXU,EAAa,GACbX,EAAW5O,EACX6O,EAAW,KACXI,IACA,WAAW,IAAM,CACfM,EAAa,GACTP,GAAYJ,GACdK,GAEJ,EAAGK,CAAK,EAKZ,CACF,EAEA,UAAW,CACT,QAAQ9F,EAAK,CAEX,MADc,mDACD,KAAKA,GAAO,EAAE,CAC7B,EACA,QAAQA,EAAK,CAEX,MADc,gBACD,KAAKA,GAAO,EAAE,CAC7B,EACA,MAAMA,EAAK,CAET,MADc,4DACD,KAAKA,GAAO,EAAE,CAC7B,EACA,OAAOA,EAAK,CAEV,MADc,wFACD,KAAKA,GAAO,EAAE,CAC7B,EACA,OAAOA,EAAK,CAEV,MADc,2CACD,KAAKA,GAAO,EAAE,CAC7B,EACA,KAAKA,EAAK,CACR,OAAO,KAAK,OAAOA,CAAG,GAAK,KAAK,OAAOA,CAAG,CAC5C,EACA,SAASA,EAAK,CAEZ,MADc,6EACD,KAAKA,GAAO,EAAE,CAC7B,EACA,WAAWA,EAAK,CAEd,MADc,qCACD,KAAKA,GAAO,EAAE,CAC7B,EACA,aAAaA,EAAK,CAChB,MAAMgG,EAAQ,2FACRC,EAAWjG,EAAI,QAAQ,MAAO,EAAE,EACtC,GAAI,CAACgG,EAAM,KAAKC,CAAQ,EAAG,MAAO,GAClC,IAAIC,EAAM,EACNC,EAAY,GAChB,QAASvK,EAAIqK,EAAS,OAAS,EAAGrK,GAAK,EAAGA,IAAK,CAC7C,IAAIwK,EAAQ,SAASH,EAASrK,CAAC,EAAG,EAAE,EAChCuK,IACFC,GAAS,EACLA,EAAQ,IAAGA,GAAS,IAE1BF,GAAOE,EACPD,EAAY,CAACA,CACf,CACA,OAAOD,EAAM,KAAO,CACtB,EACA,WAAWlG,EAAK,CAEd,MADc,qCACD,KAAKA,GAAO,EAAE,CAC7B,EACA,MAAMA,EAAK,CAET,MAAM1H,EADQ,+CACM,KAAK0H,GAAO,EAAE,EAClC,OAAK1H,EACEA,EAAM,MAAM,CAAC,EAAE,MAAM2J,GAAO,SAASA,CAAG,GAAK,GAAK,SAASA,CAAG,GAAK,GAAG,EAD1D,EAErB,EACA,OAAOjC,EAAK,CAEV,MAAM1H,EADQ,iEACM,KAAK0H,GAAO,EAAE,EAClC,GAAI,CAAC1H,EAAO,MAAO,GACnB,KAAM,CAAA,CAAG,EAAG+N,EAAGpI,EAAGD,CAAC,EAAI1F,EACvB,OAAO,SAAS,CAAC,GAAK,GAAK,SAAS,CAAC,GAAK,KACnC,SAAS+N,CAAC,GAAK,GAAK,SAASA,CAAC,GAAK,KACnC,SAASpI,CAAC,GAAK,GAAK,SAASA,CAAC,GAAK,KACnC,WAAWD,CAAC,GAAK,GAAK,WAAWA,CAAC,GAAK,CAChD,EACA,QAAQgC,EAAK,CACX,OAAO,KAAK,WAAWA,CAAG,GAAK,KAAK,MAAMA,CAAG,GAAK,KAAK,OAAOA,CAAG,CACnE,EACA,OAAOA,EAAK,CACV,MAAO,CAAC,MAAM,IAAI,KAAKA,CAAG,EAAE,QAAO,CAAE,CACvC,EACA,OAAOA,EAAK,CACV,GAAI,CACF,YAAK,MAAMA,CAAG,EACP,EACT,MAAQ,CACN,MAAO,EACT,CACF,EACA,QAAQA,EAAK,CACX,MAAO,CAACA,GAAOA,EAAI,KAAI,IAAO,EAChC,EACA,aAAaA,EAAK,CAChB,MAAO,QAAQ,KAAKA,GAAO,EAAE,CAC/B,EACA,SAASA,EAAK,CACZ,MAAO,CAAC,MAAM,WAAWA,CAAG,CAAC,GAAK,SAASA,CAAG,CAChD,EACA,UAAUA,EAAK,CACb,MAAO,UAAU,KAAKA,GAAO,EAAE,CACjC,EACA,QAAQA,EAAK,CACX,MAAO,eAAe,KAAKA,GAAO,EAAE,CACtC,EACA,WAAWA,EAAK,CACd,MAAMwD,EAAM,WAAWxD,CAAG,EAC1B,MAAO,CAAC,MAAMwD,CAAG,GAAKA,EAAM,CAC9B,EACA,WAAWxD,EAAK,CACd,MAAMwD,EAAM,WAAWxD,CAAG,EAC1B,MAAO,CAAC,MAAMwD,CAAG,GAAKA,EAAM,CAC9B,EACA,QAAQxD,EAAK,CACX,MAAO,cAAc,KAAKA,GAAO,EAAE,CACrC,EACA,eAAeA,EAAK,CAClB,MAAO,iBAAiB,KAAKA,GAAO,EAAE,CACxC,EACA,UAAUA,EAAK,CACb,MAAO,qBAAqB,KAAKA,GAAO,EAAE,CAC5C,EACA,SAASA,EAAKiD,EAAK9D,EAAK,CACtB,MAAMmH,GAAOtG,GAAO,IAAI,OACxB,OAAOsG,GAAOrD,IAAQ9D,IAAQ,QAAamH,GAAOnH,EACpD,EACA,UAAUa,EAAKiD,EAAK,CAClB,OAAQjD,GAAO,IAAI,QAAUiD,CAC/B,EACA,UAAUjD,EAAKb,EAAK,CAClB,OAAQa,GAAO,IAAI,QAAUb,CAC/B,EACA,QAAQa,EAAKgG,EAAO,CAClB,OAAQA,aAAiB,OAAUA,EAAM,KAAKhG,GAAO,EAAE,EAAI,EAC7D,EACA,OAAOuG,EAAMC,EAAM,CACjB,OAAO,OAAOD,CAAI,IAAM,OAAOC,CAAI,CACrC,EACA,SAASxG,EAAKyG,EAAW,CACvB,OAAQzG,GAAO,IAAI,SAASyG,CAAS,CACvC,EACA,YAAYzG,EAAKyG,EAAW,CAC1B,MAAO,CAAC,KAAK,SAASzG,EAAKyG,CAAS,CACtC,EACA,QAAQ5F,EAAK,CACX,OAAO,MAAM,QAAQA,CAAG,CAC1B,EACA,YAAYA,EAAKoC,EAAK9D,EAAK,CACzB,MAAMmH,EAAMzF,EAAMA,EAAI,OAAS,EAC/B,OAAOyF,GAAOrD,IAAQ9D,IAAQ,QAAamH,GAAOnH,EACpD,EACA,eAAe0B,EAAKoC,EAAK,CACvB,OAAOpC,EAAMA,EAAI,QAAUoC,EAAM,EACnC,EACA,eAAepC,EAAK1B,EAAK,CACvB,OAAO0B,EAAMA,EAAI,QAAU1B,EAAM,EACnC,EACA,SAASiD,EAAK,CACZ,OAAOA,IAAQ,MAAQ,OAAOA,GAAQ,UAAY,CAAC,MAAM,QAAQA,CAAG,CACtE,EACA,QAAQA,EAAKE,EAAM,CACjB,MAAI,CAACF,GAAO,CAACE,GAAQ,CAAC,MAAM,QAAQA,CAAI,EAAU,GAC3CA,EAAK,MAAMhM,GAAO,OAAO,UAAU,eAAe,KAAK8L,EAAK9L,CAAG,CAAC,CACzE,EACA,SAAS8L,EAAKsE,EAAO,CACnB,MAAMC,EAAS,CAAA,EACf,cAAO,KAAKD,CAAK,EAAE,QAAQpQ,GAAO,CAChC,MAAMxB,EAAQsN,EAAI9L,CAAG,EACfsQ,EAAaF,EAAMpQ,CAAG,EACtBuQ,EAAc,CAAA,EAEpBD,EAAW,QAAQE,GAAQ,CACzB,GAAI,OAAOA,GAAS,SAAU,CAC5B,KAAM,CAACjS,EAAM,GAAG0D,CAAM,EAAIuO,EAAK,MAAM,GAAG,EACnC,KAAKjS,CAAI,EAAEC,EAAO,GAAGyD,CAAM,GAC9BsO,EAAY,KAAKhS,CAAI,CAEzB,SAAW,OAAOiS,GAAS,WAAY,CACrC,MAAMnR,EAASmR,EAAKhS,EAAOsN,CAAG,EAC1BzM,IAAW,IACbkR,EAAY,KAAKlR,GAAU,mBAAmB,CAElD,CACF,CAAC,EAEGkR,EAAY,OAAS,IACvBF,EAAOrQ,CAAG,EAAIuQ,EAElB,CAAC,EAEM,CACL,MAAO,OAAO,KAAKF,CAAM,EAAE,SAAW,EACtC,OAAAA,CACR,CACI,CACJ,EAEE,OAAQ,CACN,IAAI3G,EAAK,CACP,MAAM+G,EAAU/G,EAAM,OAAOA,CAAG,EAAI,GAC9BgH,EAAW,CACf,WAAY,WAAY,WAAY,SAC5C,EAEYC,EAAI,CACR,WAAY,WAAY,UAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,WACpC,WAAY,SAAY,WAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,WAAY,SACpC,WAAY,WAAY,UAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UAC5C,EAEYC,EAAI,CACR,CAAC,EAAG,GAAI,GAAI,EAAE,EAAG,CAAC,EAAG,EAAG,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,GAAI,EAAE,EAAG,CAAC,EAAG,GAAI,GAAI,EAAE,CACxE,EAEM,SAASC,EAAWrS,EAAOsS,EAAO,CAChC,OAAQtS,GAASsS,EAAUtS,IAAW,GAAKsS,CAC7C,CAEA,SAASC,EAAWN,EAAS,CAC3B,MAAMO,EAAYP,EAAQ,OAAS,EAEnC,IADAA,GAAW,IACHA,EAAQ,OAAS,KAAQ,IAC/BA,GAAW,KAEb,MAAMQ,EAAWD,EAAY,WACvBE,EAAaF,IAAc,GAAM,WACvC,QAAS1L,EAAI,EAAGA,EAAI,EAAGA,IACrBmL,GAAW,OAAO,aAAcQ,IAAc,EAAI3L,EAAM,GAAI,EAE9D,QAASA,EAAI,EAAGA,EAAI,EAAGA,IACrBmL,GAAW,OAAO,aAAcS,IAAe,EAAI5L,EAAM,GAAI,EAE/D,OAAOmL,CACT,CAEA,SAASU,EAAaC,EAAOC,EAAO,CAClC,KAAM,CAAC3J,EAAGC,EAAGgC,EAAG2H,CAAC,EAAID,EACfE,EAAQ,CAAA,EACd,QAASjM,EAAI,EAAGA,EAAI,GAAIA,IACtBiM,EAAMjM,CAAC,EAAK8L,EAAM,WAAW9L,EAAI,CAAC,EAAI,KACzB8L,EAAM,WAAW9L,EAAI,EAAI,CAAC,EAAI,MAAS,GACvC8L,EAAM,WAAW9L,EAAI,EAAI,CAAC,EAAI,MAAS,IACvC8L,EAAM,WAAW9L,EAAI,EAAI,CAAC,EAAI,MAAS,GAGtD,IAAIkM,EAAK9J,EAAG+J,EAAK9J,EAAG+J,EAAK/H,EAAGgI,EAAKL,EAEjC,QAAShM,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,IAAIsM,EAAG7B,EACP,MAAM8B,EAAQ,KAAK,MAAMvM,EAAI,EAAE,EACzBwM,EAAYxM,EAAI,GAElBuM,IAAU,GACZD,EAAKH,EAAKC,EAAO,CAACD,EAAKE,EACvB5B,EAAI+B,GACKD,IAAU,GACnBD,EAAKD,EAAKF,EAAO,CAACE,EAAKD,EACvB3B,GAAK,EAAI+B,EAAY,GAAK,IACjBD,IAAU,GACnBD,EAAIH,EAAKC,EAAKC,EACd5B,GAAK,EAAI+B,EAAY,GAAK,KAE1BF,EAAIF,GAAMD,EAAK,CAACE,GAChB5B,EAAK,EAAI+B,EAAa,IAGxB,MAAMC,EAAOJ,EACbA,EAAKD,EACLA,EAAKD,EACLA,EAAKA,EAAKZ,EAAYW,EAAKI,EAAIjB,EAAErL,CAAC,EAAIiM,EAAMxB,CAAC,EAAK,WAAYa,EAAEiB,CAAK,EAAEvM,EAAI,CAAC,CAAC,EAC7EkM,EAAKO,CACP,CAEA,MAAO,CACJrK,EAAI8J,EAAM,WACV7J,EAAI8J,EAAM,WACV9H,EAAI+H,EAAM,WACVJ,EAAIK,EAAM,UACrB,CACM,CAEA,MAAMK,EAAgBjB,EAAWN,CAAO,EACxC,IAAIY,EAAQ,CAAC,GAAGX,CAAQ,EAExB,QAASpL,EAAI,EAAGA,EAAI0M,EAAc,OAAQ1M,GAAK,GAC7C+L,EAAQF,EAAaa,EAAc,UAAU1M,EAAGA,EAAI,EAAE,EAAG+L,CAAK,EAGhE,IAAIhS,EAAS,GACb,OAAAgS,EAAM,QAAQY,GAAQ,CACpB,QAAS3M,EAAI,EAAGA,EAAI,EAAGA,IACrBjG,IAAY4S,IAAU,EAAI3M,EAAM,KAAM,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAEtE,CAAC,EAEMjG,CACT,EAEA,OAAOqK,EAAK,CACV,MAAM+G,EAAU/G,EAAM,OAAOA,CAAG,EAAI,GAC9BiH,EAAI,CACR,WAAY,WAAY,WAAY,WACpC,UAAY,WAAY,WAAY,WACpC,WAAY,UAAY,UAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UACpC,UAAY,UAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UACpC,UAAY,UAAY,UAAY,UACpC,UAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,WAAY,UAC5C,EAEM,SAASuB,EAAY1T,EAAOsS,EAAO,CACjC,OAAQtS,IAAUsS,EAAUtS,GAAU,GAAKsS,CAC7C,CAEA,SAASC,EAAWN,EAAS,CAC3B,MAAMO,EAAYP,EAAQ,OAAS,EAEnC,IADAA,GAAW,IACHA,EAAQ,OAAS,KAAQ,IAC/BA,GAAW,KAEb,MAAMQ,EAAWD,EAAY,WACvBE,EAAaF,IAAc,GAAM,WACvC,QAAS1L,EAAI,EAAGA,EAAI,EAAGA,IACrBmL,GAAW,OAAO,aAAcS,IAAe,EAAI5L,EAAM,GAAI,EAE/D,QAASA,EAAI,EAAGA,EAAI,EAAGA,IACrBmL,GAAW,OAAO,aAAcQ,IAAc,EAAI3L,EAAM,GAAI,EAE9D,OAAOmL,CACT,CAEA,SAASU,EAAaC,EAAOC,EAAO,CAClC,MAAME,EAAQ,CAAA,EACd,QAASjM,EAAI,EAAGA,EAAI,GAAIA,IACtBiM,EAAMjM,CAAC,EAAK8L,EAAM,WAAW9L,EAAI,CAAC,EAAI,KACzB8L,EAAM,WAAW9L,EAAI,EAAI,CAAC,EAAI,MAAS,GACvC8L,EAAM,WAAW9L,EAAI,EAAI,CAAC,EAAI,MAAS,IACvC8L,EAAM,WAAW9L,EAAI,EAAI,CAAC,EAAI,MAAS,GAGtD,QAASA,EAAI,GAAIA,EAAI,GAAIA,IAAK,CAC5B,MAAM6M,EAAKD,EAAYX,EAAMjM,EAAI,EAAE,EAAG,CAAC,EAAI4M,EAAYX,EAAMjM,EAAI,EAAE,EAAG,EAAE,EAAKiM,EAAMjM,EAAI,EAAE,IAAM,EACzF8M,EAAKF,EAAYX,EAAMjM,EAAI,CAAC,EAAG,EAAE,EAAI4M,EAAYX,EAAMjM,EAAI,CAAC,EAAG,EAAE,EAAKiM,EAAMjM,EAAI,CAAC,IAAM,GAC7FiM,EAAMjM,CAAC,EAAKiM,EAAMjM,EAAI,EAAE,EAAI6M,EAAKZ,EAAMjM,EAAI,CAAC,EAAI8M,EAAM,UACxD,CAEA,GAAI,CAAC1K,EAAGC,EAAGgC,EAAG2H,EAAGvS,EAAG6S,EAAG7B,EAAGnI,CAAC,EAAIyJ,EAE/B,QAAS/L,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,MAAM+M,EAAKH,EAAYnT,EAAG,CAAC,EAAImT,EAAYnT,EAAG,EAAE,EAAImT,EAAYnT,EAAG,EAAE,EAC/DuT,EAAMvT,EAAI6S,EAAM,CAAC7S,EAAIgR,EACrBwC,EAAS3K,EAAIyK,EAAKC,EAAK3B,EAAErL,CAAC,EAAIiM,EAAMjM,CAAC,EAAK,WAC1CkN,EAAKN,EAAYxK,EAAG,CAAC,EAAIwK,EAAYxK,EAAG,EAAE,EAAIwK,EAAYxK,EAAG,EAAE,EAC/D+K,EAAO/K,EAAIC,EAAMD,EAAIiC,EAAMhC,EAAIgC,EAC/B+I,EAASF,EAAKC,EAAO,WAE3B7K,EAAImI,EACJA,EAAI6B,EACJA,EAAI7S,EACJA,EAAKuS,EAAIiB,EAAS,WAClBjB,EAAI3H,EACJA,EAAIhC,EACJA,EAAID,EACJA,EAAK6K,EAAQG,EAAS,UACxB,CAEA,MAAO,CACJrB,EAAM,CAAC,EAAI3J,EAAK,WAChB2J,EAAM,CAAC,EAAI1J,EAAK,WAChB0J,EAAM,CAAC,EAAI1H,EAAK,WAChB0H,EAAM,CAAC,EAAIC,EAAK,WAChBD,EAAM,CAAC,EAAItS,EAAK,WAChBsS,EAAM,CAAC,EAAIO,EAAK,WAChBP,EAAM,CAAC,EAAItB,EAAK,WAChBsB,EAAM,CAAC,EAAIzJ,EAAK,UAC3B,CACM,CAEA,MAAMoK,EAAgBjB,EAAWN,CAAO,EACxC,IAAIY,EAAQ,CACV,WAAY,WAAY,WAAY,WACpC,WAAY,WAAY,UAAY,UAC5C,EAEM,QAAS/L,EAAI,EAAGA,EAAI0M,EAAc,OAAQ1M,GAAK,GAC7C+L,EAAQF,EAAaa,EAAc,UAAU1M,EAAGA,EAAI,EAAE,EAAG+L,CAAK,EAGhE,IAAIhS,EAAS,GACb,OAAAgS,EAAM,QAAQY,GAAQ,CACpB,QAAS3M,EAAI,EAAGA,GAAK,EAAGA,IACtBjG,IAAY4S,IAAU,EAAI3M,EAAM,KAAM,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAEtE,CAAC,EAEMjG,CACT,EAEA,aAAaqK,EAAK,CAChB,MAAMW,EAAQ,mEACd,IAAIhL,EAAS,GACTiG,EAAI,EACR,MAAMqN,EAAQjJ,EAAMA,EAAI,MAAM,EAAE,EAAE,IAAIC,GAAKA,EAAE,WAAW,CAAC,CAAC,EAAI,CAAA,EAE9D,KAAOrE,EAAIqN,EAAM,QAAQ,CACvB,MAAMC,EAAQD,EAAMrN,GAAG,EACjBuN,EAAQF,EAAMrN,GAAG,GAAK,EACtBwN,EAAQH,EAAMrN,GAAG,GAAK,EAEtByN,EAAOH,GAAS,EAChBI,GAASJ,EAAQ,IAAM,EAAMC,GAAS,EACtCI,GAASJ,EAAQ,KAAO,EAAMC,GAAS,EACvCI,EAAOJ,EAAQ,GAErBzT,GAAUgL,EAAM0I,CAAI,EAAI1I,EAAM2I,CAAI,GACvB1N,EAAIqN,EAAM,OAAS,EAAI,IAAMtI,EAAM4I,CAAI,IACvC3N,EAAIqN,EAAM,OAAS,IAAMtI,EAAM6I,CAAI,EAChD,CAEA,OAAO7T,CACT,EAEA,aAAaqK,EAAK,CAChB,MAAMW,EAAQ,mEACd,IAAIhL,EAAS,GACTiG,EAAI,EAGR,IAFAoE,EAAMA,EAAI,QAAQ,mBAAoB,EAAE,EAEjCpE,EAAIoE,EAAI,QAAQ,CACrB,MAAMqJ,EAAO1I,EAAM,QAAQX,EAAI,OAAOpE,GAAG,CAAC,EACpC0N,EAAO3I,EAAM,QAAQX,EAAI,OAAOpE,GAAG,CAAC,EACpC2N,EAAO5I,EAAM,QAAQX,EAAI,OAAOpE,GAAG,CAAC,EACpC4N,EAAO7I,EAAM,QAAQX,EAAI,OAAOpE,GAAG,CAAC,EAEpCsN,EAASG,GAAQ,EAAMC,GAAQ,EAC/BH,GAAUG,EAAO,KAAO,EAAMC,GAAQ,EACtCH,GAAUG,EAAO,IAAM,EAAKC,EAElC7T,GAAU,OAAO,aAAauT,CAAK,EAC/BK,IAAS,KAAI5T,GAAU,OAAO,aAAawT,CAAK,GAChDK,IAAS,KAAI7T,GAAU,OAAO,aAAayT,CAAK,EACtD,CAEA,OAAOzT,CACT,EAEA,MAAO,CACL,MAAO,uCAAuC,QAAQ,QAAUsK,GAAM,CACpE,MAAMW,EAAI,KAAK,OAAM,EAAK,GAAK,EAE/B,OADUX,IAAM,IAAMW,EAAKA,EAAI,EAAM,GAC5B,SAAS,EAAE,CACtB,CAAC,CACH,CACJ,EAEE,QAAS,CACP,MAAO,IAAI,IAEX,MAAM,UAAUhI,EAAKhB,EAAU,GAAI,CACjC,KAAM,CAAE,YAAA6R,EAAc,WAAW,EAAK7R,EAEtC,OAAI,KAAK,MAAM,IAAIgB,CAAG,EACb,KAAK,MAAM,IAAIA,CAAG,EAGpB,IAAI,QAAQ,CAACU,EAASwB,IAAW,CACtC,MAAM4O,EAAM,IAAI,MAChBA,EAAI,YAAcD,EAElBC,EAAI,OAAS,IAAM,CACjB,KAAK,MAAM,IAAI9Q,EAAK8Q,CAAG,EACvBpQ,EAAQoQ,CAAG,CACb,EAEAA,EAAI,QAAU,IAAM,CAClB5O,EAAO,IAAI,MAAM,yBAAyBlC,CAAG,EAAE,CAAC,CAClD,EAEA8Q,EAAI,IAAM9Q,CACZ,CAAC,CACH,EAEA,MAAM,WAAW+Q,EAAM/R,EAAU,GAAI,CACnC,KAAM,CAAE,SAAA2D,EAAW,EAAI,EAAK3D,EAE5B,GAAI2D,EACF,OAAO,QAAQ,IAAIoO,EAAK,IAAI/Q,GAAO,KAAK,UAAUA,EAAKhB,CAAO,CAAC,CAAC,EAGlE,MAAMgS,EAAU,CAAA,EAChB,UAAWhR,KAAO+Q,EAChBC,EAAQ,KAAK,MAAM,KAAK,UAAUhR,EAAKhB,CAAO,CAAC,EAEjD,OAAOgS,CACT,EAEA,MAAM,WAAWhR,EAAKhB,EAAU,GAAI,CAClC,KAAM,CAAE,KAAA0E,EAAO,kBAAmB,MAAAuN,EAAQ,GAAM,MAAAC,EAAQ,EAAK,EAAKlS,EAElE,OAAI,KAAK,MAAM,IAAIgB,CAAG,EACb,KAAK,MAAM,IAAIA,CAAG,EAGpB,IAAI,QAAQ,CAACU,EAASwB,IAAW,CACtC,MAAMiP,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,KAAOzN,EACdyN,EAAO,MAAQF,EACfE,EAAO,MAAQD,EAEfC,EAAO,OAAS,IAAM,CACpB,KAAK,MAAM,IAAInR,EAAKmR,CAAM,EAC1BzQ,EAAQyQ,CAAM,CAChB,EAEAA,EAAO,QAAU,IAAM,CACrBA,EAAO,OAAM,EACbjP,EAAO,IAAI,MAAM,0BAA0BlC,CAAG,EAAE,CAAC,CACnD,EAEAmR,EAAO,IAAMnR,EACb,SAAS,KAAK,YAAYmR,CAAM,CAClC,CAAC,CACH,EAEA,MAAM,eAAenR,EAAKhB,EAAU,GAAI,CACtC,KAAM,CAAE,MAAAoS,EAAQ,KAAK,EAAKpS,EAE1B,OAAI,KAAK,MAAM,IAAIgB,CAAG,EACb,KAAK,MAAM,IAAIA,CAAG,EAGpB,IAAI,QAAQ,CAACU,EAASwB,IAAW,CACtC,MAAMmP,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,IAAM,aACXA,EAAK,KAAOrR,EACZqR,EAAK,MAAQD,EAEbC,EAAK,OAAS,IAAM,CAClB,KAAK,MAAM,IAAIrR,EAAKqR,CAAI,EACxB3Q,EAAQ2Q,CAAI,CACd,EAEAA,EAAK,QAAU,IAAM,CACnBA,EAAK,OAAM,EACXnP,EAAO,IAAI,MAAM,8BAA8BlC,CAAG,EAAE,CAAC,CACvD,EAEA,SAAS,KAAK,YAAYqR,CAAI,CAChC,CAAC,CACH,EAEA,MAAM,SAASC,EAAYC,EAAKvS,EAAU,CAAA,EAAI,CAC5C,KAAM,CAAE,OAAAwS,EAAS,SAAU,MAAA3Q,EAAQ,QAAQ,EAAK7B,EAC1CyS,EAAW,IAAI,SAASH,EAAY,OAAOC,CAAG,IAAK,CAAE,OAAAC,EAAQ,MAAA3Q,CAAK,CAAE,EAE1E,GAAI,CACF,aAAM4Q,EAAS,OACf,SAAS,MAAM,IAAIA,CAAQ,EACpBA,CACT,MAAY,CACV,MAAM,IAAI,MAAM,wBAAwBH,CAAU,EAAE,CACtD,CACF,EAEA,MAAM,QAAQtR,EAAK0D,EAAO,QAAS,CACjC,OAAQA,EAAI,CACV,IAAK,QACH,OAAO,KAAK,UAAU1D,CAAG,EAC3B,IAAK,SACH,OAAO,KAAK,WAAWA,CAAG,EAC5B,IAAK,aACL,IAAK,QACH,OAAO,KAAK,eAAeA,CAAG,EAChC,QACE,MAAM,IAAI,MAAM,6BAA6B0D,CAAI,EAAE,CAC7D,CACI,EAEA,SAAS1D,EAAK,CACZ,OAAO,KAAK,MAAM,IAAIA,CAAG,CAC3B,EAEA,YAAa,CACX,KAAK,MAAM,OACb,EAEA,gBAAgBA,EAAK,CACnB,KAAK,MAAM,OAAOA,CAAG,CACvB,CACJ,CACA,EAEA,OAAO,YAAcmH,GACrB,OAAO,YAAcA,GCj7CrB,MAAMuK,EAAS,CACb,aAAc,CACZ,KAAK,SAAW,GAChB,KAAK,KAAO,EACd,CACF,CAEA,MAAMC,CAAS,CACb,aAAc,CACZ,KAAK,KAAO,IAAID,EAClB,CAEA,OAAOhU,EAAK,CACV,IAAIkB,EAAO,KAAK,KAChB,MAAMgT,EAAQlU,EAAI,MAAM,GAAG,EAE3BkU,EAAM,QAAQ,CAACC,EAAMjS,IAAU,CACxBhB,EAAK,SAASiT,CAAI,IACrBjT,EAAK,SAASiT,CAAI,EAAI,IAAIH,IAE5B9S,EAAOA,EAAK,SAASiT,CAAI,EACrBjS,IAAUgS,EAAM,OAAS,GAC3BhT,EAAK,KAAK,KAAKlB,CAAG,CAEtB,CAAC,CACH,CAEA,WAAWA,EAAK,CACd,IAAIkB,EAAO,KAAK,KAChB,MAAMgT,EAAQlU,EAAI,MAAM,GAAG,EACrBX,EAAS,CAAA,EAEf,QAASiG,EAAI,EAAGA,EAAI4O,EAAM,OAAQ5O,IAAK,CACrC,MAAM6O,EAAOD,EAAM5O,CAAC,EACpB,GAAI,CAACpE,EAAK,SAASiT,CAAI,EACrB,MAEFjT,EAAOA,EAAK,SAASiT,CAAI,EAEzB,MAAMC,EAAeC,GAAM,CACrBA,EAAE,KAAK,OAAS,GAClBhV,EAAO,KAAK,GAAGgV,EAAE,IAAI,EAEvB,OAAO,OAAOA,EAAE,QAAQ,EAAE,QAAQlT,GAASiT,EAAYjT,CAAK,CAAC,CAC/D,EACAiT,EAAYlT,CAAI,CAClB,CAEA,MAAO,CAAC,GAAG,IAAI,IAAI7B,CAAM,CAAC,CAC5B,CAEA,cAAcW,EAAK,CACjB,MAAMkU,EAAQlU,EAAI,MAAM,GAAG,EACrBX,EAAS,CAAA,EAEf,QAASiG,EAAI,EAAGA,GAAK4O,EAAM,OAAQ5O,IAAK,CACtC,MAAM9D,EAAa0S,EAAM,MAAM,EAAG5O,CAAC,EAAE,KAAK,GAAG,EAC7CjG,EAAO,KAAKmC,CAAU,CACxB,CAEA,OAAOnC,CACT,CACF,CAEA,MAAMiV,EAAmB,CACvB,OAAQ,OAAO,iBAAiB,EAChC,KAAM,OAAO,eAAe,EAC5B,WAAY,OAAO,sBAAsB,CAC3C,EAEA,MAAMC,EAAe,CACnB,aAAc,CACZ,KAAK,QAAU,GACf,KAAK,KAAO,KACZ,KAAK,UAAY,GACjB,KAAK,SAAW,GAChB,KAAK,mBAAqB,GAC1B,KAAK,SAAW,IAAIN,EACpB,KAAK,YAAc,IAAI,IACvB,KAAK,aAAe,GACpB,KAAK,gBAAkB,IAAI,IAC3B,KAAK,cAAgB,IAAI,IACzB,KAAK,UAAY,GACjB,KAAK,cAAgB,GACrB,KAAK,YAAc,IAAI,QAEvB,KAAK,mBAAkB,CACzB,CAEA,oBAAqB,CACnB,MAAMnV,EAAU,CACd,IAAK,CAAC0V,EAAQxU,EAAKyU,IAAa,CAC9B,GAAIzU,IAAQ,UAAW,OAAOwU,EAC9B,MAAMnV,EAAS,QAAQ,IAAImV,EAAQxU,EAAKyU,CAAQ,EAChD,OAAIpV,GAAU,OAAOA,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,EACxD,KAAK,aAAaA,EAAQW,CAAG,EAE/BX,CACT,EACA,IAAK,CAACmV,EAAQxU,EAAKxB,EAAOiW,IAAa,CACrC,MAAMC,EAAW,QAAQ,IAAIF,EAAQxU,EAAKyU,CAAQ,EAC5CpV,EAAS,QAAQ,IAAImV,EAAQxU,EAAKxB,EAAOiW,CAAQ,EAEjD/S,EAAW,KAAK,YAAY8S,EAAQxU,CAAG,EAC7C,YAAK,OAAO0B,EAAUlD,EAAOkW,CAAQ,EACrC,KAAK,YAAYhT,EAAUlD,CAAK,EAEzBa,CACT,EACA,eAAgB,CAACmV,EAAQxU,IAAQ,CAC/B,MAAM0U,EAAW,QAAQ,IAAIF,EAAQxU,EAAK,QAAQ,EAC5CX,EAAS,QAAQ,eAAemV,EAAQxU,CAAG,EAE3C0B,EAAW,KAAK,YAAY8S,EAAQxU,CAAG,EAC7C,YAAK,OAAO0B,EAAU,OAAWgT,CAAQ,EACzC,KAAK,YAAYhT,EAAU,MAAS,EAE7BrC,CACT,CACN,EAEI,KAAK,KAAO,IAAI,MAAM,KAAK,QAASP,CAAO,EAC3C,KAAK,KAAK,WAAa,KACvB,KAAK,KAAK,SAAW,EACvB,CAEA,aAAagN,EAAK6I,EAAW,CAC3B,GAAI7I,EAAIwI,EAAiB,UAAU,EAAG,OAAOxI,EAE7C,GAAI,KAAK,YAAY,IAAIA,CAAG,EAC1B,OAAO,KAAK,YAAY,IAAIA,CAAG,EAGjC,MAAMhN,EAAU,CACd,IAAK,CAAC0V,EAAQxU,EAAKyU,IAAa,CAC9B,GAAIzU,IAAQ,UAAW,OAAOwU,EAC9B,GAAIxU,IAAQsU,EAAiB,QAAUtU,IAAQ,aAAc,OAAOwU,EAAOF,EAAiB,MAAM,EAClG,GAAItU,IAAQsU,EAAiB,MAAQtU,IAAQ,WAAY,OAAOwU,EAAOF,EAAiB,IAAI,EAC5F,GAAItU,IAAQsU,EAAiB,YAActU,IAAQ,iBAAkB,MAAO,GAE5E,MAAMX,EAAS,QAAQ,IAAImV,EAAQxU,EAAKyU,CAAQ,EAChD,OAAIpV,GAAU,OAAOA,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,EACxD,KAAK,aAAaA,EAAQ,GAAGmV,EAAOF,EAAiB,IAAI,CAAC,GAAGE,EAAOF,EAAiB,IAAI,EAAI,IAAM,EAAE,GAAGtU,CAAG,EAAE,EAE/GX,CACT,EACA,IAAK,CAACmV,EAAQxU,EAAKxB,EAAOiW,IAAa,CACrC,GAAIzU,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,YACzBtU,IAAQ,cACRA,IAAQ,YACRA,IAAQ,iBACV,MAAO,GAGT,MAAM0U,EAAW,QAAQ,IAAIF,EAAQxU,EAAKyU,CAAQ,EAC5CpV,EAAS,QAAQ,IAAImV,EAAQxU,EAAKxB,EAAOiW,CAAQ,EAEjD/S,EAAW,GAAG8S,EAAOF,EAAiB,IAAI,CAAC,GAAGE,EAAOF,EAAiB,IAAI,EAAI,IAAM,EAAE,GAAGtU,CAAG,GAClG,YAAK,OAAO0B,EAAUlD,EAAOkW,CAAQ,EACrC,KAAK,YAAYhT,EAAUlD,CAAK,EAEzBa,CACT,EACA,eAAgB,CAACmV,EAAQxU,IAAQ,CAC/B,GAAIA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,WAC3B,MAAO,GAGT,MAAMI,EAAW,QAAQ,IAAIF,EAAQxU,CAAG,EAClCX,EAAS,QAAQ,eAAemV,EAAQxU,CAAG,EAE3C0B,EAAW,GAAG8S,EAAOF,EAAiB,IAAI,CAAC,GAAGE,EAAOF,EAAiB,IAAI,EAAI,IAAM,EAAE,GAAGtU,CAAG,GAClG,YAAK,OAAO0B,EAAU,OAAWgT,CAAQ,EACzC,KAAK,YAAYhT,EAAU,MAAS,EAE7BrC,CACT,EACA,IAAK,CAACmV,EAAQxU,IACRA,IAAQ,WACRA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,YACzBtU,IAAQ,cACRA,IAAQ,YACRA,IAAQ,iBACH,GAEFA,KAAOwU,EAEhB,QAAUA,GACD,QAAQ,QAAQA,CAAM,EAAE,OAAOxU,GACpCA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,UACnC,EAEM,yBAA0B,CAACE,EAAQxU,IAC7BA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,WACpB,CACL,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAOE,EAAOxU,CAAG,CAC7B,EAEe,QAAQ,yBAAyBwU,EAAQxU,CAAG,CAE3D,EAEU4U,EAAQ,IAAI,MAAM9I,EAAKhN,CAAO,EACpC,OAAAgN,EAAIwI,EAAiB,MAAM,EAAIxI,EAC/BA,EAAIwI,EAAiB,IAAI,EAAIK,EAC7B7I,EAAIwI,EAAiB,UAAU,EAAI,GACnC,KAAK,YAAY,IAAIxI,EAAK8I,CAAK,EAE/B,OAAO,KAAK9I,CAAG,EAAE,QAAQ9L,GAAO,CAC1B8L,EAAI9L,CAAG,GAAK,OAAO8L,EAAI9L,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQ8L,EAAI9L,CAAG,CAAC,IACrE8L,EAAI9L,CAAG,EAAI,KAAK,aAAa8L,EAAI9L,CAAG,EAAG,GAAG2U,CAAS,GAAGA,EAAY,IAAM,EAAE,GAAG3U,CAAG,EAAE,EAEtF,CAAC,EAEM4U,CACT,CAEA,YAAYJ,EAAQxU,EAAK,CACvB,OAAIwU,EAAOF,EAAiB,IAAI,EACvB,GAAGE,EAAOF,EAAiB,IAAI,CAAC,IAAItU,CAAG,GAEzCA,CACT,CAEA,YAAYA,EAAKxB,EAAO,CACtB,KAAK,YAAY,IAAIwB,EAAKxB,CAAK,EAE1B,KAAK,eACR,KAAK,aAAe,GACpB,sBAAsB,IAAM,CAC1B,KAAK,aAAY,CACnB,CAAC,EAEL,CAEA,cAAe,CACb,MAAMqW,EAAc,IAAI,IAExB,KAAK,YAAY,QAAQ,CAACrW,EAAOwB,IAAQ,CACvC6U,EAAY,IAAI7U,CAAG,EACnB,KAAK,qBAAqBA,EAAKxB,CAAK,EAEpB,KAAK,SAAS,WAAWwB,CAAG,EACpC,QAAQ8U,GAAU,CACxB,GAAI,CAACD,EAAY,IAAIC,CAAM,EAAG,CAC5B,MAAMC,EAAW,KAAK,IAAID,CAAM,EAChC,KAAK,qBAAqBA,EAAQC,CAAQ,EAC1CF,EAAY,IAAIC,CAAM,CACxB,CACF,CAAC,CACH,CAAC,EAED,KAAK,YAAY,QACjB,KAAK,gBAAe,EACpB,KAAK,aAAe,EACtB,CAEA,qBAAqB9U,EAAKxB,EAAO,CAC3B,KAAK,SAASwB,CAAG,GACnB,KAAK,SAASA,CAAG,EAAE,QAAQ5B,GAAW,CACpC,KAAK,cAAcA,EAASI,CAAK,CACnC,CAAC,CAEL,CAEA,iBAAkB,CACK,OAAO,KAAK,KAAK,kBAAkB,EAE3C,QAAQD,GAAQ,CACd,KAAK,mBAAmBA,CAAI,EAChB,KAAK,KAAKyW,GAC1B,KAAK,YAAY,IAAIA,CAAG,GACxB,KAAK,SAAS,WAAWA,CAAG,EAAE,KAAKC,GAAK,KAAK,YAAY,IAAIA,CAAC,CAAC,CACvE,GAGC,KAAK,uBAAuB1W,CAAI,CAEpC,CAAC,CACH,CAEA,IAAIyB,EAAKxB,EAAO0W,EAAS,GAAO,CAC9B,MAAMR,EAAW,KAAK,IAAI1U,CAAG,EAEzB,OAAOA,GAAQ,UACjB,OAAO,OAAO,KAAK,QAASA,CAAG,EAC/B,OAAO,KAAKA,CAAG,EAAE,QAAQiV,GAAK,CACvBC,IACH,KAAK,OAAOD,EAAGjV,EAAIiV,CAAC,EAAGP,IAAWO,CAAC,CAAC,EACpC,KAAK,YAAYA,EAAGjV,EAAIiV,CAAC,CAAC,EAE9B,CAAC,IAEGjV,EAAI,SAAS,GAAG,EAClB,KAAK,UAAUA,EAAKxB,CAAK,EAEzB,KAAK,QAAQwB,CAAG,EAAIxB,EAGjB0W,IACH,KAAK,OAAOlV,EAAKxB,EAAOkW,CAAQ,EAChC,KAAK,YAAY1U,EAAKxB,CAAK,IAI1B0W,GACH,KAAK,gBAAe,CAExB,CAEA,IAAIlV,EAAK,CACP,GAAKA,EACL,OAAIA,EAAI,SAAS,GAAG,EACX,KAAK,UAAUA,CAAG,EAEpB,KAAK,QAAQA,CAAG,CACzB,CAEA,UAAU4B,EAAM,CACd,GAAKA,EACL,OAAOA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACkK,EAAK9L,IAAQ8L,IAAM9L,CAAG,EAAG,KAAK,OAAO,CACtE,CAEA,UAAU4B,EAAMpD,EAAO,CACrB,MAAMwN,EAAOpK,EAAK,MAAM,GAAG,EACrBqK,EAAUD,EAAK,MACfmJ,EAASnJ,EAAK,OAAO,CAACF,EAAK9L,KAC1B8L,EAAI9L,CAAG,IAAG8L,EAAI9L,CAAG,EAAI,IACnB8L,EAAI9L,CAAG,GACb,KAAK,OAAO,EAET0U,EAAWS,EAAOlJ,CAAO,EAC/BkJ,EAAOlJ,CAAO,EAAIzN,EAClB,KAAK,OAAOoD,EAAMpD,EAAOkW,CAAQ,EACjC,KAAK,YAAY9S,EAAMpD,CAAK,CAC9B,CAEA,QAAQwB,EAAKoV,EAAU,CAChB,KAAK,UAAUpV,CAAG,IACrB,KAAK,UAAUA,CAAG,EAAI,IAExB,KAAK,UAAUA,CAAG,EAAE,KAAKoV,CAAQ,CACnC,CAEA,UAAUpV,EAAKoV,EAAU,CACnB,KAAK,UAAUpV,CAAG,IACpB,KAAK,UAAUA,CAAG,EAAI,KAAK,UAAUA,CAAG,EAAE,OAAOf,GAAMA,IAAOmW,CAAQ,EAE1E,CAEA,OAAOpV,EAAKxB,EAAOkW,EAAU,CACvB,KAAK,UAAU1U,CAAG,GACpB,KAAK,UAAUA,CAAG,EAAE,QAAQoV,GAAY,CACtC,GAAI,CACFA,EAAS5W,EAAOkW,CAAQ,CAC1B,OAAS3V,EAAG,CACV,QAAQ,MAAM,sBAAsBiB,CAAG,IAAKjB,CAAC,CAC/C,CACF,CAAC,EAGH,KAAK,UAAU,GAAG,GAAG,QAAQqW,GAAY,CACvC,GAAI,CACFA,EAASpV,EAAKxB,EAAOkW,CAAQ,CAC/B,OAAS3V,EAAG,CACV,QAAQ,MAAM,2BAA4BA,CAAC,CAC7C,CACF,CAAC,CACH,CAEA,cAAcX,EAASI,EAAO,CAC5B,MAAM6W,EAAUjX,EAAQ,aAAa,WAAW,EAChD,GAAI,CAACiX,EAAS,OAEGA,EAAQ,MAAM,GAAG,EAEzB,QAAQ1N,GAAK,CACpB,MAAMuM,EAAQvM,EAAE,MAAM,GAAG,EACnB3B,EAAOkO,EAAM,CAAC,EAAE,KAAI,EACpBM,EAASN,EAAM,CAAC,GAAG,KAAI,EAE7B,OAAQlO,EAAI,CACV,IAAK,OACC5H,EAAQ,cAAgB,OAAOI,GAAS,EAAE,IAC5CJ,EAAQ,YAAcI,GAAS,IAEjC,MACF,IAAK,OACCJ,EAAQ,YAAc,OAAOI,GAAS,EAAE,IAC1CJ,EAAQ,UAAYI,GAAS,IAE/B,MACF,IAAK,QACCJ,EAAQ,OAAS,WACfA,EAAQ,UAAY,CAAC,CAACI,IACxBJ,EAAQ,QAAU,CAAC,CAACI,GAEbJ,EAAQ,QAAU,OAAOI,GAAS,EAAE,IAC7CJ,EAAQ,MAAQI,GAAS,IAE3B,MACF,IAAK,UACCJ,EAAQ,UAAY,CAAC,CAACI,IACxBJ,EAAQ,QAAU,CAAC,CAACI,GAEtB,MACF,IAAK,WACCJ,EAAQ,WAAa,CAAC,CAACI,IACzBJ,EAAQ,SAAW,CAAC,CAACI,GAEvB,MACF,IAAK,SACH,MAAM8W,EAAU9W,EAAQ,OAAS,GAC7BJ,EAAQ,MAAM,UAAYkX,IAC5BlX,EAAQ,MAAM,QAAUkX,GAE1B,MACF,IAAK,QACCd,IACEhW,EACFJ,EAAQ,UAAU,IAAIoW,CAAM,EAE5BpW,EAAQ,UAAU,OAAOoW,CAAM,GAGnC,MACF,IAAK,QACCA,GAAUpW,EAAQ,MAAMoW,CAAM,IAAM,OAAOhW,GAAS,EAAE,IACxDJ,EAAQ,MAAMoW,CAAM,EAAIhW,GAAS,IAEnC,MACF,IAAK,OACCgW,GACcpW,EAAQ,aAAaoW,CAAM,IAC3B,OAAOhW,GAAS,EAAE,GAChCJ,EAAQ,aAAaoW,EAAQhW,GAAS,EAAE,EAG5C,MACF,IAAK,MACCJ,EAAQ,MAAQ,OAAOI,GAAS,EAAE,IACpCJ,EAAQ,IAAMI,GAAS,IAEzB,MACF,IAAK,OACCJ,EAAQ,OAAS,OAAOI,GAAS,EAAE,IACrCJ,EAAQ,KAAOI,GAAS,IAE1B,MACF,IAAK,cACCJ,EAAQ,cAAgB,OAAOI,GAAS,EAAE,IAC5CJ,EAAQ,YAAcI,GAAS,IAEjC,KACV,CACI,CAAC,CACH,CAEA,SAASD,EAAMgX,EAAMH,EAAU,CAC7B,KAAK,mBAAmB7W,CAAI,EAAI,CAAE,KAAAgX,EAAM,SAAAH,CAAQ,EAEhDG,EAAK,QAAQP,GAAO,CAClB,KAAK,SAAS,OAAOA,CAAG,CAC1B,CAAC,EAED,KAAK,uBAAuBzW,CAAI,CAClC,CAEA,uBAAuBA,EAAM,CAC3B,MAAMiX,EAAO,KAAK,mBAAmBjX,CAAI,EACzC,GAAKiX,EAEL,GAAI,CACF,MAAMC,EAASD,EAAK,KAAK,IAAIR,GAAO,KAAK,IAAIA,CAAG,CAAC,EAC3C3V,EAASmW,EAAK,SAAS,GAAGC,CAAM,EACtC,KAAK,IAAIlX,EAAMc,EAAQ,EAAI,CAC7B,OAASN,EAAG,CACV,QAAQ,MAAM,sBAAsBR,CAAI,IAAKQ,CAAC,CAChD,CACF,CAEA,KAAKF,EAAM,CACT,OAAO,KAAKA,CAAI,EAAE,QAAQmB,GAAO,CAC3BnB,EAAKmB,CAAG,GAAK,OAAOnB,EAAKmB,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQnB,EAAKmB,CAAG,CAAC,EACxE,KAAK,QAAQA,CAAG,EAAI,KAAK,aAAanB,EAAKmB,CAAG,EAAGA,CAAG,EAEpD,KAAK,QAAQA,CAAG,EAAInB,EAAKmB,CAAG,EAE9B,KAAK,YAAYA,EAAK,KAAK,QAAQA,CAAG,CAAC,CACzC,CAAC,EAED,KAAK,gBAAe,CACtB,CAEA,OAAQ,CACN,KAAK,QAAU,GACf,KAAK,UAAY,GACjB,KAAK,SAAW,GAChB,KAAK,mBAAqB,GAC1B,KAAK,SAAW,IAAIiU,EACpB,KAAK,YAAY,QACjB,KAAK,UAAY,GACjB,KAAK,mBAAkB,EACvB,KAAK,KAAI,CACX,CAEA,QAAQjU,EAAKsB,EAAU,GAAI,CACzB,KAAM,CACJ,QAASoU,EAAc,QACvB,SAAAC,EAAW,EACX,QAAAC,EAAU,EACV,QAAAC,EAAU,GACV,cAAAC,EAAgB,IACtB,EAAQxU,EAEEyU,EAAUL,IAAgB,UAAY,eAAiB,aAE7D,KAAK,cAAc,IAAI1V,EAAK,CAC1B,QAAA+V,EACA,SAAAJ,EACA,QAAS,KACT,QAAAC,EACA,QAAAC,EACA,cAAAC,CACN,CAAK,EAED,MAAMtX,EAAQ,KAAK,IAAIwB,CAAG,EACtBxB,IAAU,QACZ,KAAK,aAAawB,EAAKxB,EAAOuX,EAAS,CAAE,QAAAH,EAAS,QAAAC,EAAS,cAAAC,CAAa,CAAE,EAG5E,KAAK,QAAQ9V,EAAMgW,GAAa,CAC9B,MAAMzS,EAAS,KAAK,cAAc,IAAIvD,CAAG,EACpCuD,IAEDA,EAAO,SAAW,GAChBA,EAAO,SAAS,aAAaA,EAAO,OAAO,EAC/CA,EAAO,QAAU,WAAW,IAAM,CAChC,KAAK,aAAavD,EAAKgW,EAAUzS,EAAO,QAAS,CAC/C,QAASA,EAAO,QAChB,QAASA,EAAO,QAChB,cAAeA,EAAO,aAClC,CAAW,CACH,EAAGA,EAAO,QAAQ,GAElB,KAAK,aAAavD,EAAKgW,EAAUzS,EAAO,QAAS,CAC/C,QAASA,EAAO,QAChB,QAASA,EAAO,QAChB,cAAeA,EAAO,aAChC,CAAS,EAEL,CAAC,CACH,CAEA,aAAavD,EAAKxB,EAAOuX,EAASzU,EAAU,CAAA,EAAI,CAC9C,GAAI,CACF,KAAM,CAAE,QAAAsU,EAAU,EAAG,QAAAC,EAAU,GAAO,cAAAC,EAAgB,IAAI,EAAKxU,EAEzD2U,EAAc,CAClB,MAAAzX,EACA,QAAAoX,EACA,UAAW,KAAK,IAAG,CAC3B,EAEM,IAAIM,EAAa,KAAK,UAAUD,CAAW,EAEvCJ,GAAWC,IACbI,EAAa,KAAK,SAASA,EAAYJ,CAAa,GAGtD,KAAK,uBAAuBC,CAAO,EACnCA,EAAQ,QAAQ,UAAU/V,CAAG,GAAIkW,CAAU,CAC7C,OAASnX,EAAG,CAGV,GAFA,QAAQ,KAAK,yBAAyBiB,CAAG,IAAKjB,CAAC,EAE3CA,EAAE,OAAS,sBAAwBgX,IAAY,aAAc,CAC/D,QAAQ,KAAK,8DAA8D/V,CAAG,EAAE,EAChF,GAAI,CACF,eAAe,QAAQ,UAAUA,CAAG,GAAI,KAAK,UAAU,CAAE,MAAAxB,EAAO,QAAS,CAAC,CAAE,CAAC,CAC/E,OAAS2X,EAAI,CACX,QAAQ,KAAK,sCAAsCnW,CAAG,IAAKmW,CAAE,CAC/D,CACF,CACF,CACF,CAEA,uBAAuBJ,EAAS,CAC9B,GAAI,CACF,MAAMK,EAAU,0BAChBL,EAAQ,QAAQK,EAAS,MAAM,EAC/BL,EAAQ,WAAWK,CAAO,CAC5B,OAAS,EAAG,CACN,EAAE,OAAS,sBACb,KAAK,mBAAmBL,CAAO,CAEnC,CACF,CAEA,mBAAmBA,EAAS,CAC1B,MAAM5I,EAAM,KAAK,MACXkJ,EAAS,GAAK,GAAK,GAAK,GAAK,IAEnC,QAAS/Q,EAAI,EAAGA,EAAIyQ,EAAQ,OAAQzQ,IAAK,CACvC,MAAMtF,EAAM+V,EAAQ,IAAIzQ,CAAC,EACzB,GAAItF,GAAK,WAAW,SAAS,EAC3B,GAAI,CACF,MAAMnB,EAAO,KAAK,MAAMkX,EAAQ,QAAQ/V,CAAG,CAAC,EACxCnB,EAAK,WAAasO,EAAMtO,EAAK,UAAYwX,GAC3CN,EAAQ,WAAW/V,CAAG,CAE1B,MAAY,CACV+V,EAAQ,WAAW/V,CAAG,CACxB,CAEJ,CACF,CAEA,SAASsW,EAAMtW,EAAK,CAClB,OAAK,OAAO,SAIL,OAAO,SAAS,IAAI,QAAQsW,EAAMtW,CAAG,EAAE,YAH5C,QAAQ,KAAK,4CAA4C,EAClDsW,EAGX,CAEA,SAASC,EAAYvW,EAAK,CACxB,GAAI,CAAC,OAAO,SACV,eAAQ,KAAK,4CAA4C,EAClDuW,EAET,GAAI,CAEF,OADc,OAAO,SAAS,IAAI,QAAQA,EAAYvW,CAAG,EAC5C,SAAS,OAAO,SAAS,IAAI,IAAI,CAChD,OAASjB,EAAG,CACV,eAAQ,KAAK,qBAAsBA,CAAC,EAC7BwX,CACT,CACF,CAEA,UAAUvW,EAAK,CACb,MAAMuD,EAAS,KAAK,cAAc,IAAIvD,CAAG,EACrCuD,IACEA,EAAO,SAAS,aAAaA,EAAO,OAAO,EAC/CA,EAAO,QAAQ,WAAW,UAAUvD,CAAG,EAAE,EACzC,KAAK,cAAc,OAAOA,CAAG,EAEjC,CAEA,cAAcsB,EAAU,GAAI,CAC1B,MAAMkV,EAAY,CAAA,EACZ,CAAE,cAAAV,EAAgB,IAAI,EAAKxU,EAEjC,QAASgE,EAAI,EAAGA,EAAI,aAAa,OAAQA,IAAK,CAC5C,MAAMtF,EAAM,aAAa,IAAIsF,CAAC,EAC9B,GAAItF,GAAK,WAAW,SAAS,EAAG,CAC9B,MAAMyD,EAAUzD,EAAI,QAAQ,UAAW,EAAE,EACzC,GAAI,CACF,MAAMyW,EAAS,aAAa,QAAQzW,CAAG,EACvC,IAAI0W,EAEJ,GAAIZ,EAAe,CACjB,MAAMa,EAAY,KAAK,SAASF,EAAQX,CAAa,EACrDY,EAAS,KAAK,MAAMC,CAAS,CAC/B,MACED,EAAS,KAAK,MAAMD,CAAM,EAG5B,GAAIC,EAAO,UAAY,QAAaA,EAAO,UAAYpV,EAAQ,QAAS,CACtE,QAAQ,MAAM,8BAA8BmC,CAAO,aAAaiT,EAAO,OAAO,GAAG,EACjF,QACF,CAEAF,EAAU/S,CAAO,EAAIiT,EAAO,QAAU,OAAYA,EAAO,MAAQA,CACnE,OAAS3X,EAAG,CACV,QAAQ,KAAK,gCAAgC0E,CAAO,IAAK1E,CAAC,CAC5D,CACF,CACF,CAEA,QAASuG,EAAI,EAAGA,EAAI,eAAe,OAAQA,IAAK,CAC9C,MAAMtF,EAAM,eAAe,IAAIsF,CAAC,EAChC,GAAItF,GAAK,WAAW,SAAS,EAAG,CAC9B,MAAMyD,EAAUzD,EAAI,QAAQ,UAAW,EAAE,EACzC,GAAI,CACF,MAAMyW,EAAS,eAAe,QAAQzW,CAAG,EACzC,IAAI0W,EAEJ,GAAIZ,EAAe,CACjB,MAAMa,EAAY,KAAK,SAASF,EAAQX,CAAa,EACrDY,EAAS,KAAK,MAAMC,CAAS,CAC/B,MACED,EAAS,KAAK,MAAMD,CAAM,EAG5B,GAAIC,EAAO,UAAY,QAAaA,EAAO,UAAYpV,EAAQ,QAAS,CACtE,QAAQ,MAAM,8BAA8BmC,CAAO,aAAaiT,EAAO,OAAO,GAAG,EACjF,QACF,CAEAF,EAAU/S,CAAO,EAAIiT,EAAO,QAAU,OAAYA,EAAO,MAAQA,CACnE,MAAY,CAAC,CACf,CACF,CAEA,OAAI,OAAO,KAAKF,CAAS,EAAE,OAAS,GAClC,KAAK,KAAKA,CAAS,EAGdA,CACT,CAEA,OAAO3X,EAAM,CACX,GAAI,OAAO,iBAAoB,WAC7B,GAAI,CACF,OAAO,gBAAgBA,CAAI,CAC7B,OAAS,EAAG,CACV,QAAQ,KAAK,gDAAiD,CAAC,CACjE,CAEF,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAI,CAAC,CACxC,CAEA,UAAW,CACT,MAAM+X,EAAW,KAAK,OAAO,KAAK,OAAO,EACzC,YAAK,UAAU,KAAKA,CAAQ,EACxB,KAAK,UAAU,OAAS,KAAK,eAC/B,KAAK,UAAU,QAEV,KAAK,UAAU,OAAS,CACjC,CAEA,SAAS1U,EAAQ,GAAI,CACnB,GAAI,KAAK,UAAU,SAAW,EAAG,MAAO,GAExC,MAAM2U,EAAgB3U,GAAS,EAAIA,EAAQ,KAAK,UAAU,OAAS,EAC7D0U,EAAW,KAAK,UAAUC,CAAa,EAE7C,OAAKD,GAEL,KAAK,QAAU,KAAK,OAAOA,CAAQ,EACnC,KAAK,mBAAkB,EAEvB,OAAO,KAAK,KAAK,OAAO,EAAE,QAAQ5W,GAAO,CACvC,KAAK,YAAYA,EAAK,KAAK,QAAQA,CAAG,CAAC,CACzC,CAAC,EAED,KAAK,gBAAe,EACb,IAVe,EAWxB,CAEA,kBAAmB,CACjB,OAAO,KAAK,UAAU,MACxB,CAEA,gBAAiB,CACf,KAAK,UAAY,EACnB,CAEA,cAAc8W,EAAa,CACzB,MAAMjY,EAAO,CAAA,EAEb,OAAAiY,EAAY,iBAAiB,yBAAyB,EAAE,QAAQ1Y,GAAW,CACzE,MAAMG,EAAOH,EAAQ,aAAa,WAAW,EAC7C,GAAI,CAACG,EAAM,OAGX,MAAMyB,EADQzB,EAAK,MAAM,GAAG,EACV,CAAC,GAAG,KAAI,EACrByB,IAED5B,EAAQ,OAAS,YACdS,EAAKmB,CAAG,IAAGnB,EAAKmB,CAAG,EAAI,IACxB5B,EAAQ,SACVS,EAAKmB,CAAG,EAAE,KAAK5B,EAAQ,KAAK,GAErBA,EAAQ,OAAS,QACtBA,EAAQ,UACVS,EAAKmB,CAAG,EAAI5B,EAAQ,OAGtBS,EAAKmB,CAAG,EAAI5B,EAAQ,MAExB,CAAC,EAEMS,CACT,CAEA,SAASiY,EAAajY,EAAM,CAC1B,OAAO,KAAKA,CAAI,EAAE,QAAQmB,GAAO,CAC/B8W,EAAY,iBAAiB,iBAAmB9W,EAAM,IAAI,EAAE,QAAQ5B,GAAW,CACzEA,EAAQ,OAAS,WACnBA,EAAQ,QAAU,MAAM,QAAQS,EAAKmB,CAAG,CAAC,EACrCnB,EAAKmB,CAAG,EAAE,SAAS5B,EAAQ,KAAK,EAChC,CAAC,CAACS,EAAKmB,CAAG,EACL5B,EAAQ,OAAS,QAC1BA,EAAQ,QAAUA,EAAQ,QAAUS,EAAKmB,CAAG,EAE5C5B,EAAQ,MAAQS,EAAKmB,CAAG,GAAK,EAEjC,CAAC,CACH,CAAC,CACH,CAEA,eAAewU,EAAQ5S,EAAO,GAAI,CAChC,GAAI4S,EAAOF,EAAiB,UAAU,EAAG,OAAOE,EAEhD,GAAI,KAAK,YAAY,IAAIA,CAAM,EAC7B,OAAO,KAAK,YAAY,IAAIA,CAAM,EAGpC,MAAM1V,EAAU,CACd,IAAK,CAAC0V,EAAQxU,EAAKyU,IAAa,CAC9B,GAAIzU,IAAQ,UAAW,OAAOwU,EAC9B,GAAIxU,IAAQsU,EAAiB,QAAUtU,IAAQ,aAAc,OAAOwU,EAAOF,EAAiB,MAAM,EAClG,GAAItU,IAAQsU,EAAiB,MAAQtU,IAAQ,WAAY,OAAOwU,EAAOF,EAAiB,IAAI,EAC5F,GAAItU,IAAQsU,EAAiB,YAActU,IAAQ,iBAAkB,MAAO,GAE5E,MAAMX,EAAS,QAAQ,IAAImV,EAAQxU,EAAKyU,CAAQ,EAChD,OAAIpV,GAAU,OAAOA,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,EACxD,KAAK,aAAaA,EAAQ,GAAGmV,EAAOF,EAAiB,IAAI,CAAC,GAAGE,EAAOF,EAAiB,IAAI,EAAI,IAAM,EAAE,GAAGtU,CAAG,EAAE,EAE/GX,CACT,EACA,IAAK,CAACmV,EAAQxU,EAAKxB,EAAOiW,IAAa,CACrC,GAAIzU,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,YACzBtU,IAAQ,cACRA,IAAQ,YACRA,IAAQ,iBACV,MAAO,GAGT,MAAM0U,EAAW,QAAQ,IAAIF,EAAQxU,EAAKyU,CAAQ,EAC5CpV,EAAS,QAAQ,IAAImV,EAAQxU,EAAKxB,EAAOiW,CAAQ,EAEjD/S,EAAW,GAAG8S,EAAOF,EAAiB,IAAI,CAAC,GAAGE,EAAOF,EAAiB,IAAI,EAAI,IAAM,EAAE,GAAGtU,CAAG,GAClG,YAAK,OAAO0B,EAAUlD,EAAOkW,CAAQ,EACrC,KAAK,YAAYhT,EAAUlD,CAAK,EAEzBa,CACT,EACA,eAAgB,CAACmV,EAAQxU,IAAQ,CAC/B,GAAIA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,WAC3B,MAAO,GAGT,MAAMI,EAAW,QAAQ,IAAIF,EAAQxU,CAAG,EAClCX,EAAS,QAAQ,eAAemV,EAAQxU,CAAG,EAE3C0B,EAAW,GAAG8S,EAAOF,EAAiB,IAAI,CAAC,GAAGE,EAAOF,EAAiB,IAAI,EAAI,IAAM,EAAE,GAAGtU,CAAG,GAClG,YAAK,OAAO0B,EAAU,OAAWgT,CAAQ,EACzC,KAAK,YAAYhT,EAAU,MAAS,EAE7BrC,CACT,EACA,IAAK,CAACmV,EAAQxU,IACRA,IAAQ,WACRA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,YACzBtU,IAAQ,cACRA,IAAQ,YACRA,IAAQ,iBACH,GAEFA,KAAOwU,EAEhB,QAAUA,GACD,QAAQ,QAAQA,CAAM,EAAE,OAAOxU,GACpCA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,UACnC,EAEM,yBAA0B,CAACE,EAAQxU,IAC7BA,IAAQsU,EAAiB,QACzBtU,IAAQsU,EAAiB,MACzBtU,IAAQsU,EAAiB,WACpB,CACL,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAOE,EAAOxU,CAAG,CAC7B,EAEe,QAAQ,yBAAyBwU,EAAQxU,CAAG,CAE3D,EAEU4U,EAAQ,IAAI,MAAMJ,EAAQ1V,CAAO,EACvC,OAAA0V,EAAOF,EAAiB,MAAM,EAAIE,EAClCA,EAAOF,EAAiB,IAAI,EAAI1S,EAChC4S,EAAOF,EAAiB,UAAU,EAAI,GACtC,KAAK,YAAY,IAAIE,EAAQI,CAAK,EAElC,OAAO,KAAKJ,CAAM,EAAE,QAAQxU,GAAO,CAC7BwU,EAAOxU,CAAG,GAAK,OAAOwU,EAAOxU,CAAG,GAAM,UAAY,CAAC,MAAM,QAAQwU,EAAOxU,CAAG,CAAC,IAC9EwU,EAAOxU,CAAG,EAAI,KAAK,aAAawU,EAAOxU,CAAG,EAAG,GAAG4B,CAAI,GAAGA,EAAO,IAAM,EAAE,GAAG5B,CAAG,EAAE,EAElF,CAAC,EAEM4U,CACT,CAEA,MAAO,CACL,SAAS,iBAAiB,aAAa,EAAE,QAAQxW,GAAW,CAC1D,KAAK,aAAaA,CAAO,CAC3B,CAAC,EAEI,KAAK,oBACR,KAAK,kBAAoB,IAAI,iBAAkB4C,GAAc,CAC3DA,EAAU,QAAQC,GAAY,CAC5BA,EAAS,WAAW,QAAQC,GAAQ,CAC9BA,EAAK,WAAa,KAAK,eACJA,EAAK,iBAAiB,aAAa,EAC3C,QAAQ9C,GAAW,KAAK,aAAaA,CAAO,CAAC,EACtD8C,EAAK,cAAgBA,EAAK,aAAa,WAAW,GACpD,KAAK,aAAaA,CAAI,EAG5B,CAAC,CACH,CAAC,CACH,CAAC,EAED,KAAK,kBAAkB,QAAQ,SAAS,KAAM,CAC5C,UAAW,GACX,QAAS,EACjB,CAAO,EAEL,CAEA,aAAa9C,EAAS,CAEpB,MAAM8V,EADU9V,EAAQ,aAAa,WAAW,EAC1B,MAAM,GAAG,EACd8V,EAAM,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAI,EAC5C,MAAMlU,EAAMkU,EAAM,CAAC,GAAG,KAAI,EAE1B,GAAKlU,EAYL,IAVA,KAAK,SAAS,OAAOA,CAAG,EAEnB,KAAK,SAASA,CAAG,IACpB,KAAK,SAASA,CAAG,EAAI,IAGlB,KAAK,SAASA,CAAG,EAAE,SAAS5B,CAAO,GACtC,KAAK,SAAS4B,CAAG,EAAE,KAAK5B,CAAO,EAG7BA,EAAQ,UAAY,SAAWA,EAAQ,UAAY,YAAcA,EAAQ,UAAY,SAAU,CACjG,MAAM2Y,EAAkB3Y,EAAQ,oBAC5B2Y,GACF3Y,EAAQ,oBAAoB,QAAS2Y,CAAe,EAGtD,MAAMjY,EAAU,IAAM,CACpB,MAAMN,EAAQJ,EAAQ,OAAS,WAAaA,EAAQ,QAAUA,EAAQ,MAClE4B,EAAI,SAAS,GAAG,EAClB,KAAK,UAAUA,EAAKxB,CAAK,EAEzB,KAAK,IAAIwB,EAAKxB,CAAK,CAEvB,EAEAJ,EAAQ,oBAAsBU,EAC9BV,EAAQ,iBAAiB,QAASU,CAAO,CAC3C,CAEI,KAAK,QAAQkB,CAAG,IAAM,QACxB,KAAK,cAAc5B,EAAS,KAAK,QAAQ4B,CAAG,CAAC,EAEjD,CAEA,SAAU,CACJ,KAAK,oBACP,KAAK,kBAAkB,aACvB,KAAK,kBAAoB,MAG3B,OAAO,OAAO,KAAK,QAAQ,EAAE,QAAQU,GAAY,CAC/CA,EAAS,QAAQtC,GAAW,CAC1B,MAAMU,EAAUV,EAAQ,oBACpBU,IACFV,EAAQ,oBAAoB,QAASU,CAAO,EAC5C,OAAOV,EAAQ,oBAEnB,CAAC,CACH,CAAC,EAED,KAAK,cAAc,QAAQ,CAACmF,EAAQvD,IAAQ,CACtCuD,EAAO,SAAS,aAAaA,EAAO,OAAO,CACjD,CAAC,EACD,KAAK,cAAc,QAEnB,KAAK,QAAU,GACf,KAAK,UAAY,GACjB,KAAK,SAAW,GAChB,KAAK,mBAAqB,GAC1B,KAAK,SAAW,IAAI0Q,EACpB,KAAK,YAAY,QACjB,KAAK,UAAY,EACnB,CACF,CAEA,MAAM+C,CAAY,CAChB,YAAYzY,EAAM+C,EAAU,GAAI,CAC9B,KAAK,KAAO/C,EACZ,KAAK,UAAY,WAAWA,CAAI,KAEhC,MAAM0Y,EAAe3V,EAAQ,MAAQA,EAAQ,MAAK,EAAK,GACvD,KAAK,QAAUA,EAAQ,SAAW,CAAA,EAClC,KAAK,QAAUA,EAAQ,SAAW,CAAA,EAClC,KAAK,UAAYA,EAAQ,WAAa,CAAA,EAEtC,KAAK,UAAY,GAEb,OAAO,YACT,OAAO,WAAW,IAAI,KAAK,UAAW2V,CAAY,EAClD,KAAK,MAAQ,OAAO,WAAW,OAAO,KAAK,SAAS,GAClD,OAAO,WAAW,eAAeA,EAAc,KAAK,SAAS,EAE/D,OAAO,WAAW,QAAQ,KAAK,UAAY7X,GAAa,CACtD,KAAK,OAAOA,CAAQ,CACtB,CAAC,GAED,KAAK,MAAQ6X,EAGf,KAAK,aAAY,EACjB,KAAK,aAAY,CACnB,CAEA,cAAe,CACb,OAAO,KAAK,KAAK,OAAO,EAAE,QAAQ1Y,GAAQ,CACxC,OAAO,eAAe,KAAMA,EAAM,CAChC,IAAK,IAAM,KAAK,QAAQA,CAAI,EAAE,KAAK,KAAK,EACxC,WAAY,EACpB,CAAO,CACH,CAAC,CACH,CAEA,cAAe,CACb,OAAO,KAAK,KAAK,OAAO,EAAE,QAAQA,GAAQ,CACxC,KAAKA,CAAI,EAAI,IAAI2B,IACR,KAAK,QAAQ3B,CAAI,EAAE,CACxB,MAAO,KAAK,MACZ,OAAQ,KAAK,OAAO,KAAK,IAAI,EAC7B,SAAU,KAAK,SAAS,KAAK,IAAI,EACjC,QAAS,IACnB,EAAW,GAAG2B,CAAI,CAEd,CAAC,CACH,CAEA,OAAO8F,EAAMkR,EAAS,CACpB,MAAMjW,EAAW,KAAK,UAAU+E,CAAI,EACpC,GAAI,CAAC/E,EAAU,CACb,QAAQ,KAAK,YAAY+E,CAAI,uBAAuB,KAAK,IAAI,EAAE,EAC/D,MACF,CAEA/E,EAAS,KAAK,MAAOiW,CAAO,CAC9B,CAEA,SAASlR,EAAMkR,EAAS,CACtB,MAAMC,EAAS,KAAK,QAAQnR,CAAI,EAChC,GAAI,CAACmR,EAAQ,CACX,QAAQ,KAAK,UAAUnR,CAAI,uBAAuB,KAAK,IAAI,EAAE,EAC7D,MACF,CAEA,OAAOmR,EAAO,CACZ,MAAO,KAAK,MACZ,OAAQ,KAAK,OAAO,KAAK,IAAI,EAC7B,SAAU,KAAK,SAAS,KAAK,IAAI,EACjC,QAAS,IACf,EAAOD,CAAO,CACZ,CAEA,QAAQ9B,EAAU,CAChB,OAAK,KAAK,UAAU,GAAG,IACrB,KAAK,UAAU,GAAG,EAAI,IAExB,KAAK,UAAU,GAAG,EAAE,KAAKA,CAAQ,EAC1BA,CACT,CAEA,UAAUA,EAAU,CACd,KAAK,UAAU,GAAG,IACpB,KAAK,UAAU,GAAG,EAAI,KAAK,UAAU,GAAG,EAAE,OAAOnW,GAAMA,IAAOmW,CAAQ,EAE1E,CAEA,OAAOhW,EAAU,CACX,KAAK,UAAU,GAAG,GACpB,KAAK,UAAU,GAAG,EAAE,QAAQgW,GAAY,CACtC,GAAI,CACFA,EAAShW,CAAQ,CACnB,OAASL,EAAG,CACV,QAAQ,MAAM,4BAA4B,KAAK,IAAI,IAAKA,CAAC,CAC3D,CACF,CAAC,EAGC,OAAO,YACT,OAAO,WAAW,IAAI,KAAK,KAAMK,CAAQ,CAE7C,CAEA,QAAS,CACP,MAAO,CACL,KAAM,KAAK,KACX,MAAO,KAAK,MACZ,QAAS,OAAO,KAAK,KAAK,OAAO,EAAE,OAAO,CAACkM,EAAK/M,KAC9C+M,EAAI/M,CAAI,EAAI,KAAKA,CAAI,EACd+M,GACN,CAAA,CAAE,CACX,CACE,CACF,CAEA,MAAM8L,EAAmB,CACvB,aAAc,CACZ,KAAK,OAAS,IAAI,GACpB,CAEA,YAAY7Y,EAAM+C,EAAS,CACzB,MAAM+V,EAAQ,IAAIL,EAAYzY,EAAM+C,CAAO,EAC3C,YAAK,OAAO,IAAI/C,EAAM8Y,CAAK,EACpBA,CACT,CAEA,SAAS9Y,EAAM,CACb,OAAO,KAAK,OAAO,IAAIA,CAAI,CAC7B,CAEA,cAAc8Y,EAAO,CACfA,aAAiBL,GACnB,KAAK,OAAO,IAAIK,EAAM,KAAMA,CAAK,CAErC,CAEA,SAAU,CACR,KAAK,OAAO,OACd,CACF,CAEA,MAAMC,EAAe,CACnB,aAAc,CACZ,KAAK,OAAS,GACd,KAAK,gBAAkB,GACvB,KAAK,eAAiB,EACxB,CAEA,GAAG1Y,EAAWwW,EAAU,CACtB,OAAK,KAAK,OAAOxW,CAAS,IACxB,KAAK,OAAOA,CAAS,EAAI,IAE3B,KAAK,OAAOA,CAAS,EAAE,KAAKwW,CAAQ,EAC7BA,CACT,CAEA,IAAIxW,EAAWwW,EAAU,CACnB,KAAK,OAAOxW,CAAS,IACvB,KAAK,OAAOA,CAAS,EAAI,KAAK,OAAOA,CAAS,EAAE,OAAOK,GAAMA,IAAOmW,CAAQ,EAEhF,CAEA,KAAKxW,EAAWC,EAAM,CAChB,KAAK,OAAOD,CAAS,GACvB,KAAK,OAAOA,CAAS,EAAE,QAAQwW,GAAY,CACzC,GAAI,CACFA,EAASvW,CAAI,CACf,OAASE,EAAG,CACV,QAAQ,MAAM,8BAA8BH,CAAS,IAAKG,CAAC,CAC7D,CACF,CAAC,EAGH,KAAK,OAAO,GAAG,GAAG,QAAQqW,GAAY,CACpC,GAAI,CACFA,EAASxW,EAAWC,CAAI,CAC1B,OAASE,EAAG,CACV,QAAQ,MAAM,mCAAoCA,CAAC,CACrD,CACF,CAAC,CACH,CAEA,KAAKH,EAAWwW,EAAU,CACxB,MAAMmC,EAAgB1Y,GAAS,CAC7BuW,EAASvW,CAAI,EACb,KAAK,IAAID,EAAW2Y,CAAY,CAClC,EACA,YAAK,GAAG3Y,EAAW2Y,CAAY,EACxBA,CACT,CAEA,SAAS7Q,EAAU9H,EAAWwW,EAAU,CACtC,GAAI,CAAC,KAAK,gBAAgBxW,CAAS,EAAG,CACpC,KAAK,gBAAgBA,CAAS,EAAI,GAElC,MAAM4Y,EAAYzY,GAAM,CACtB,KAAK,gBAAgBH,CAAS,EAAE,QAAQ,CAAC,CAAE,SAAU6Y,EAAK,GAAAxY,KAAS,EAC7DF,EAAE,OAAO,QAAQ0Y,CAAG,GAAK1Y,EAAE,OAAO,QAAQ0Y,CAAG,IAC/CxY,EAAGF,CAAC,CAER,CAAC,CACH,EAEA,SAAS,iBAAiBH,EAAW4Y,CAAQ,EAC7C,KAAK,eAAe5Y,CAAS,EAAI4Y,CACnC,CAEA,YAAK,gBAAgB5Y,CAAS,EAAE,KAAK,CAAE,SAAA8H,EAAU,GAAI0O,CAAQ,CAAE,EACxDA,CACT,CAEA,WAAW1O,EAAU9H,EAAW,CAC9B,GAAI,KAAK,gBAAgBA,CAAS,IAChC,KAAK,gBAAgBA,CAAS,EAAI,KAAK,gBAAgBA,CAAS,EAAE,OAChE+L,GAAQA,EAAK,WAAajE,CAClC,EAEU,KAAK,gBAAgB9H,CAAS,EAAE,SAAW,GAAG,CAChD,MAAM4Y,EAAW,KAAK,eAAe5Y,CAAS,EAC1C4Y,IACF,SAAS,oBAAoB5Y,EAAW4Y,CAAQ,EAChD,OAAO,KAAK,eAAe5Y,CAAS,GAEtC,OAAO,KAAK,gBAAgBA,CAAS,CACvC,CAEJ,CAEA,SAAU,CACR,OAAO,QAAQ,KAAK,cAAc,EAAE,QAAQ,CAAC,CAACA,EAAW4Y,CAAQ,IAAM,CACrE,SAAS,oBAAoB5Y,EAAW4Y,CAAQ,CAClD,CAAC,EAED,KAAK,OAAS,GACd,KAAK,gBAAkB,GACvB,KAAK,eAAiB,EACxB,CACF,CAEA,MAAME,EAAa,IAAInD,GACjBoD,GAAe,IAAIL,GACnBM,EAAqB,IAAIR,GAE/B,SAASS,GAAYtZ,EAAM+C,EAAS,CAClC,OAAOsW,EAAmB,YAAYrZ,EAAM+C,CAAO,CACrD,CAEA,SAASwW,GAASvZ,EAAM,CACtB,OAAOqZ,EAAmB,SAASrZ,CAAI,CACzC,CAEA,SAAS,iBAAiB,mBAAoB,IAAM,CAClDmZ,EAAW,cAAa,EACxBA,EAAW,KAAI,CACjB,CAAC,EAED,OAAO,eAAiBnD,GACxB,OAAO,eAAiB+C,GACxB,OAAO,YAAcN,EACrB,OAAO,mBAAqBI,GAC5B,OAAO,WAAaM,EACpB,OAAO,aAAeC,GACtB,OAAO,mBAAqBC,EAC5B,OAAO,YAAcC,GACrB,OAAO,SAAWC,oECrwClB,MAAMC,EAAY,eACZC,EAAY,eAEZC,EAAgB,CACpB,CAAE,GAAI,QAAS,KAAM,KAAM,MAAO,SAAS,EAC3C,CAAE,GAAI,aAAc,KAAM,KAAM,MAAO,SAAS,EAChD,CAAE,GAAI,aAAc,KAAM,KAAM,MAAO,SAAS,EAChD,CAAE,GAAI,QAAS,KAAM,KAAM,MAAO,SAAS,EAC3C,CAAE,GAAI,aAAc,KAAM,MAAO,MAAO,SAAS,EACjD,CAAE,GAAI,WAAY,KAAM,MAAO,MAAO,SAAS,EAC/C,CAAE,GAAI,UAAW,KAAM,KAAM,MAAO,SAAS,EAC7C,CAAE,GAAI,SAAU,KAAM,KAAM,MAAO,SAAS,EAC5C,CAAE,GAAI,cAAe,KAAM,MAAO,MAAO,SAAS,EAClD,CAAE,GAAI,WAAY,KAAM,KAAM,MAAO,SAAS,EAC9C,CAAE,GAAI,SAAU,KAAM,KAAM,MAAO,SAAS,CAC9C,EAEA,SAASC,GAAW,CAClB,OAAO,aAAa,QAAQH,CAAS,GAAK,MAC5C,CAEA,SAASI,EAASC,EAAO,CACvB,GAAIA,IAAU,QAAUA,IAAU,QAAS,OAE3C,SAAS,gBAAgB,aAAa,aAAcA,CAAK,EACzD,aAAa,QAAQL,EAAWK,CAAK,EAErC,MAAMC,EAAY,SAAS,cAAc,qBAAqB,EAC9D,GAAIA,EAAW,CACbA,EAAU,aAAa,qBAAsBD,CAAK,EAClD,MAAME,EAAOD,EAAU,cAAc,aAAa,EAClD,GAAIC,EAAM,CACR,MAAMC,EAAWD,EAAK,IAAI,UAAU,EAAGA,EAAK,IAAI,YAAY,GAAG,EAAI,CAAC,EACpEA,EAAK,IAAMF,IAAU,OACjBG,EAAW,UACXA,EAAW,UACrB,CACA,CACA,CAEA,SAASC,GAAW,CAClB,OAAO,aAAa,QAAQR,CAAS,GAAK,UAC5C,CAEA,SAASS,EAASC,EAAS,CACzB,MAAMC,EAAQV,EAAc,KAAKtQ,GAAKA,EAAE,KAAO+Q,CAAO,EACtD,GAAI,CAACC,EAAO,OAEZ,SAAS,gBAAgB,aAAa,aAAcD,CAAO,EAC3D,aAAa,QAAQV,EAAWU,CAAO,EAEvC,MAAME,EAAc,SAAS,cAAc,qBAAqB,EAChE,GAAIA,EAAa,CACfA,EAAY,aAAa,qBAAsBF,CAAO,EACtD,MAAMG,EAAYD,EAAY,cAAc,aAAa,EACrDC,IACFA,EAAU,MAAM,gBAAkBF,EAAM,OAE1C,MAAMG,EAAYF,EAAY,cAAc,aAAa,EACrDE,IACFA,EAAU,YAAcH,EAAM,KAEpC,CAEuB,SAAS,iBAAiB,kBAAkB,EACpD,QAAQI,GAAO,CACtBA,EAAI,aAAa,gBAAgB,IAAML,EACzCK,EAAI,UAAU,IAAI,WAAW,EAE7BA,EAAI,UAAU,OAAO,WAAW,CAEtC,CAAG,CACH,CAEA,SAASC,GAAY,CAEnB,MAAMC,EAAaf,IACnBC,EAASc,CAAU,EAEnB,MAAMC,EAAaV,IACnBC,EAASS,CAAU,EAEnB,MAAMb,EAAY,SAAS,cAAc,qBAAqB,EAC1DA,GACFA,EAAU,iBAAiB,QAAS,IAAM,CAExC,MAAMc,EADejB,MACa,OAAS,QAAU,OACrDC,EAASgB,CAAQ,CACvB,CAAK,EAGH,IAAIC,EAAc,SAAS,eAAe,cAAc,EACnDA,IACHA,EAAc,SAAS,cAAc,KAAK,EAC1CA,EAAY,GAAK,eACjBA,EAAY,MAAM,SAAW,QAC7BA,EAAY,MAAM,IAAM,OACxBA,EAAY,MAAM,MAAQ,OAC1BA,EAAY,MAAM,OAAS,OAC3BA,EAAY,MAAM,QAAU,OAC5BA,EAAY,MAAM,QAAU,OAC5BA,EAAY,MAAM,MAAQ,QAC1BA,EAAY,MAAM,oBAAsB,iBACxCA,EAAY,MAAM,IAAM,MACxBA,EAAY,MAAM,gBAAkB,2BACpCA,EAAY,MAAM,OAAS,qCAC3BA,EAAY,MAAM,aAAe,MACjCA,EAAY,MAAM,UAAY,gCAC9BA,EAAY,MAAM,SAAW,SAE7BnB,EAAc,QAAQU,GAAS,CAC7B,MAAMI,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,aAAa,iBAAkBJ,EAAM,EAAE,EAC3CI,EAAI,MAAM,QAAU,OACpBA,EAAI,MAAM,eAAiB,SAC3BA,EAAI,MAAM,WAAa,SACvBA,EAAI,MAAM,OAAS,OACnBA,EAAI,MAAM,gBAAkBJ,EAAM,MAClCI,EAAI,MAAM,MAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,SAAS,EAAE,SAASJ,EAAM,KAAK,EAAI,UAAY,UAC9GI,EAAI,MAAM,WAAa,MACvBA,EAAI,MAAM,aAAe,MACzBA,EAAI,MAAM,OAAS,OACnBA,EAAI,MAAM,OAAS,UACnBA,EAAI,MAAM,OAAS,IACnBA,EAAI,MAAM,QAAU,IACpBA,EAAI,YAAcJ,EAAM,KACxBS,EAAY,YAAYL,CAAG,CACjC,CAAK,EAED,SAAS,KAAK,YAAYK,CAAW,GAGvC,MAAMR,EAAc,SAAS,cAAc,qBAAqB,EAE5DA,GAAeQ,IACjBR,EAAY,QAAU,SAAS7Z,EAAG,CAChCA,EAAE,gBAAe,EACjBA,EAAE,eAAc,EAChB,MAAMsa,EAAWD,EAAY,MAAM,UAAY,OAC/CA,EAAY,MAAM,QAAUC,EAAW,OAAS,OAE5CA,EACF,WAAW,IAAM,CACf,SAAS,iBAAiB,QAASC,EAAkB,EAAI,CACnE,EAAW,CAAC,EAEJ,SAAS,oBAAoB,QAASA,EAAkB,EAAI,CAEpE,EAEIF,EAAY,QAAU,SAASra,EAAG,CAChCA,EAAE,gBAAe,CACvB,GAGE,SAASua,EAAiBva,EAAG,CACvBqa,GAAeR,GACb,CAACQ,EAAY,SAASra,EAAE,MAAM,GAAK,CAAC6Z,EAAY,SAAS7Z,EAAE,MAAM,IACnEqa,EAAY,MAAM,QAAU,OAC5B,SAAS,oBAAoB,QAASE,EAAkB,EAAI,EAGpE,CAEuB,SAAS,iBAAiB,kBAAkB,EAEpD,QAAQP,GAAO,CAC1BA,EAAI,iBAAiB,QAAUha,GAAM,CACnCA,EAAE,gBAAe,EACjB,MAAM2Z,EAAUK,EAAI,aAAa,gBAAgB,EACjDN,EAASC,CAAO,EACZU,IACFA,EAAY,MAAM,QAAU,OAEpC,CAAK,CACL,CAAG,CACH,CAEA,SAASG,GAAoB,CAC3B,MAAMR,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,aAAa,oBAAqB,EAAE,EACxCA,EAAI,aAAa,qBAAsBb,EAAQ,CAAE,EACjDa,EAAI,UAAY,+CAChBA,EAAI,MAAM,SAAW,QACrBA,EAAI,MAAM,IAAM,OAChBA,EAAI,MAAM,MAAQ,OAClBA,EAAI,MAAM,OAAS,OAEnB,MAAMT,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,aACjB,MAAMkB,EAAU,SAAS,qBAAqB,QAAQ,EAChDC,EAAgBD,EAAQA,EAAQ,OAAS,CAAC,EAC1CE,EAAaD,EAAc,IAAI,UAAU,EAAGA,EAAc,IAAI,YAAY,GAAG,EAAI,CAAC,EACxF,OAAAnB,EAAK,IAAMJ,EAAQ,IAAO,OACtBwB,EAAa,mBACbA,EAAa,oBACjBpB,EAAK,MAAQ,GACbA,EAAK,OAAS,GACdA,EAAK,IAAM,eAEXS,EAAI,YAAYT,CAAI,EACpB,SAAS,KAAK,YAAYS,CAAG,EAE7BA,EAAI,iBAAiB,QAAS,IAAM,CAElC,MAAMI,EADejB,MACa,OAAS,QAAU,OACrDC,EAASgB,CAAQ,CACrB,CAAG,EAEMJ,CACT,CAEA,SAASY,GAAoB,CAC3B,MAAMpX,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,GAAK,oBACfA,EAAU,MAAM,SAAW,QAC3BA,EAAU,MAAM,IAAM,OACtBA,EAAU,MAAM,MAAQ,OACxBA,EAAU,MAAM,OAAS,OACzBA,EAAU,MAAM,QAAU,OAC1BA,EAAU,MAAM,QAAU,OAC1BA,EAAU,MAAM,MAAQ,QACxBA,EAAU,MAAM,oBAAsB,iBACtCA,EAAU,MAAM,IAAM,MACtBA,EAAU,MAAM,gBAAkB,2BAClCA,EAAU,MAAM,OAAS,qCACzBA,EAAU,MAAM,aAAe,MAC/BA,EAAU,MAAM,UAAY,gCAC5BA,EAAU,MAAM,SAAW,SAE3B0V,EAAc,QAAQU,GAAS,CAC7B,MAAMI,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,aAAa,iBAAkBJ,EAAM,EAAE,EAC3CI,EAAI,MAAM,QAAU,OACpBA,EAAI,MAAM,eAAiB,SAC3BA,EAAI,MAAM,WAAa,SACvBA,EAAI,MAAM,OAAS,OACnBA,EAAI,MAAM,gBAAkBJ,EAAM,MAClCI,EAAI,MAAM,MAAQ,CAAC,UAAW,UAAW,UAAW,UAAW,SAAS,EAAE,SAASJ,EAAM,KAAK,EAAI,UAAY,UAC9GI,EAAI,MAAM,WAAa,MACvBA,EAAI,MAAM,aAAe,MACzBA,EAAI,MAAM,OAAS,OACnBA,EAAI,MAAM,OAAS,UACnBA,EAAI,MAAM,OAAS,IACnBA,EAAI,MAAM,QAAU,IACpBA,EAAI,YAAcJ,EAAM,KACxBpW,EAAU,YAAYwW,CAAG,CAC7B,CAAG,EAED,SAAS,KAAK,YAAYxW,CAAS,EAEnC,MAAM8V,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,aAAa,oBAAqB,EAAE,EAC9CA,EAAU,aAAa,qBAAsBG,EAAQ,CAAE,EACvDH,EAAU,UAAY,kCACtBA,EAAU,MAAM,SAAW,QAC3BA,EAAU,MAAM,IAAM,OACtBA,EAAU,MAAM,MAAQ,OACxBA,EAAU,MAAM,OAAS,OACzBA,EAAU,MAAM,QAAU,OAC1BA,EAAU,MAAM,WAAa,SAC7BA,EAAU,MAAM,IAAM,MAEtB,MAAMQ,EAAY,SAAS,cAAc,MAAM,EAC/CA,EAAU,UAAY,aACtBA,EAAU,MAAM,MAAQ,OACxBA,EAAU,MAAM,OAAS,OACzBA,EAAU,MAAM,aAAe,MAC/BA,EAAU,MAAM,gBAAkBZ,EAAc,KAAKtQ,GAAKA,EAAE,KAAO6Q,EAAQ,CAAE,EAAE,MAE/E,MAAMM,EAAY,SAAS,cAAc,MAAM,EAC/CA,EAAU,UAAY,aACtBA,EAAU,MAAM,SAAW,OAC3BA,EAAU,YAAcb,EAAc,KAAKtQ,GAAKA,EAAE,KAAO6Q,GAAU,EAAE,KAErEH,EAAU,YAAYQ,CAAS,EAC/BR,EAAU,YAAYS,CAAS,EAC/B,SAAS,KAAK,YAAYT,CAAS,EAEnCA,EAAU,QAAU,SAAStZ,EAAG,CAC9BA,EAAE,gBAAe,EACjBA,EAAE,eAAc,EAChB,MAAMsa,EAAW9W,EAAU,MAAM,UAAY,OAC7CA,EAAU,MAAM,QAAU8W,EAAW,OAAS,OAE1CA,EACF,WAAW,IAAM,CACf,SAAS,iBAAiB,QAASO,EAAsB,EAAI,CACrE,EAAS,CAAC,EAEJ,SAAS,oBAAoB,QAASA,EAAsB,EAAI,CAEtE,EAEErX,EAAU,QAAU,SAASxD,EAAG,CAC9BA,EAAE,gBAAe,CACrB,EAEE,SAAS6a,EAAqB7a,EAAG,CAC3B,CAACwD,EAAU,SAASxD,EAAE,MAAM,GAAK,CAACsZ,EAAU,SAAStZ,EAAE,MAAM,IAC/DwD,EAAU,MAAM,QAAU,OAC1B,SAAS,oBAAoB,QAASqX,EAAsB,EAAI,EAEtE,CAGE,OADqBrX,EAAU,iBAAiB,kBAAkB,EACrD,QAAQwW,GAAO,CAC1BA,EAAI,iBAAiB,QAAUha,GAAM,CACnCA,EAAE,gBAAe,EACjB,MAAM2Z,EAAUK,EAAI,aAAa,gBAAgB,EACjDN,EAASC,CAAO,EAChBnW,EAAU,MAAM,QAAU,MAChC,CAAK,CACL,CAAG,EAEM,CAAE,UAAA8V,EAAW,UAAA9V,EACtB,CAEA,SAASsX,GAAe,CACtB,MAAMC,EAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAG5D,GAAI,EAFYA,EAAU,IAAI,KAAK,GAAKA,EAAU,IAAI,OAAO,GAE/C,OAEd,MAAMC,EAAc,SAAS,cAAc,yBAAyB,EACpE,GAAI,CAACA,GAAe,CAACA,EAAY,IAAK,OAEtC,MAAML,EAAaK,EAAY,IAAI,UAAU,EAAGA,EAAY,IAAI,YAAY,GAAG,EAAI,CAAC,EAE9EC,EAAiB,SAAS,cAAc,QAAQ,EACtDA,EAAe,IAAMN,EAAa,0BAClCM,EAAe,MAAQ,GAEvB,SAAS,KAAK,YAAYA,CAAc,CAC1C,CAEA,GAAqC7Z,EAAO,QAC1CA,EAAA,QAAiB,CACf,SAAA+X,EAAU,SAAAC,EAAU,UAAAa,EAAW,kBAAAO,EAC/B,SAAAf,EAAU,SAAAC,EAAU,cAAAR,EAAe,kBAAA0B,EACnC,aAAAE,CACJ,UAEM,CAAC,OAAO,yBAA0B,CAGpC,IAASI,EAAT,UAAmB,CACjBjB,IACAa,GACN,EALI,OAAO,yBAA2B,GAO9B,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,SAASK,GAAoB,CACrE,SAAS,aAAe,YAC1B,SAAS,oBAAoB,mBAAoBA,CAAiB,EAClED,IAEV,CAAO,EAED,WAAWA,EAAS,CAAC,CAE3B,sBCzWA,MAAME,EAAS,CACb,YAAY/b,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,QAAUA,EAAQ,cAAc,uBAAuB,EAC5D,KAAK,KAAOA,EAAQ,cAAc,oBAAoB,EACtD,KAAK,YAAc,KAAK,QAAU,KAAK,QAAQ,cAAc,MAAM,EAAI,KACvE,KAAK,MAAQ,YAAY,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAEhE,KAAK,qBAAuB,KAC5B,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,kBAAoB,IAC3B,CAEA,MAAO,CACD,CAAC,KAAK,SAAW,CAAC,KAAK,MACvB,KAAK,QAAQ,sBAEjB,KAAK,kBAAqBW,GAAM,CAC9B,MAAM4L,EAAO5L,EAAE,cACX,KAAK,cACP,KAAK,YAAY,YAAc4L,EAAK,YAAY,KAAI,GAEtD,KAAK,SAAQ,CACf,EAEA,KAAK,KAAK,iBAAiB,oBAAoB,EAAE,QAAQA,GAAQ,CAC/DA,EAAK,iBAAiB,QAAS,KAAK,iBAAiB,EACrDA,EAAK,0BAA4B,KAAK,iBACxC,CAAC,EAED,KAAK,qBAAwB5L,GAAM,CACjCA,EAAE,gBAAe,EACjB,KAAK,WAAU,CACjB,EAEA,KAAK,QAAQ,iBAAiB,QAAS,KAAK,oBAAoB,EAEhE,KAAK,sBAAyBA,GAAM,CAC7B,KAAK,QAAQ,SAASA,EAAE,MAAM,GACjC,KAAK,SAAQ,CAEjB,EAEI,OAAO,aACT,KAAK,uBAAyB,OAAO,aAAa,GAAG,SAAU,QAAS,KAAK,sBAAuB,CAAE,MAAO,KAAK,KAAK,CAAE,EAEzH,SAAS,iBAAiB,QAAS,KAAK,qBAAqB,EAG/D,KAAK,KAAK,MAAM,QAAU,OAC1B,KAAK,QAAQ,oBAAsB,GACrC,CAEA,YAAa,CACX,MAAMqb,EAAS,KAAK,KAAK,MAAM,UAAY,QAC3C,KAAK,KAAK,MAAM,QAAUA,EAAS,OAAS,QAC5C,KAAK,QAAQ,UAAU,OAAO,UAAW,CAACA,CAAM,CAClD,CAEA,UAAW,CACT,KAAK,KAAK,MAAM,QAAU,OAC1B,KAAK,QAAQ,UAAU,OAAO,SAAS,CACzC,CAEA,SAAU,CACH,KAAK,QAAQ,sBAEd,KAAK,SAAW,KAAK,sBACvB,KAAK,QAAQ,oBAAoB,QAAS,KAAK,oBAAoB,EAGjE,KAAK,MACP,KAAK,KAAK,iBAAiB,oBAAoB,EAAE,QAAQzP,GAAQ,CAC3DA,EAAK,2BACPA,EAAK,oBAAoB,QAASA,EAAK,yBAAyB,CAEpE,CAAC,EAGC,KAAK,wBAA0B,KAAK,uBAAuB,YAC7D,KAAK,uBAAuB,cACnB,KAAK,uBACd,SAAS,oBAAoB,QAAS,KAAK,qBAAqB,EAGlE,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,qBAAuB,KAC5B,KAAK,kBAAoB,KACzB,KAAK,QAAQ,oBAAsB,GACrC,CACF,CAEA,SAAS0P,GAAajc,EAAS,CAC7B,MAAMkc,EAAW,IAAIH,GAAS/b,CAAO,EACrCkc,EAAS,KAAI,EACblc,EAAQ,gBAAkBkc,CAC5B,CAQA,SAASC,GAAgBD,EAAU,CAC7BA,EAAS,kBACXA,EAAS,gBAAgB,UACzBA,EAAS,gBAAkB,KAE/B,CAQI,OAAO,mBACT,OAAO,kBAAkB,SAAS,WAAYD,GAAcE,EAAe,ECxH7E,MAAMC,EAAO,CACX,YAAYpc,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,QAAUA,EAAQ,cAAc,qBAAqB,EAC1D,KAAK,QAAUA,EAAQ,cAAc,mBAAmB,GAAKA,EAAQ,cAAc,0BAA0B,EAC7G,KAAK,UAAYA,EAAQ,cAAc,qBAAqB,GAAKA,EAAQ,cAAc,kBAAkB,EACzG,KAAK,aAAeA,EAAQ,cAAc,QAAQ,EAClD,KAAK,KAAOA,EAAQ,cAAc,kBAAkB,EACpD,KAAK,MAAQ,UAAU,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAE9D,KAAK,qBAAuB,KAC5B,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,oBAAsB,IAC7B,CAEA,MAAO,CACD,CAAC,KAAK,SAAW,CAAC,KAAK,WACvB,KAAK,QAAQ,sBAEjB,KAAK,oBAAuBW,GAAM,CAChC,MAAM0b,EAAS1b,EAAE,cACXP,EAAQic,EAAO,aAAa,YAAY,EAC1C,KAAK,eACP,KAAK,aAAa,MAAQjc,GAE5B,KAAK,UAAU,iBAAiB,sCAAsC,EAAE,QAAQ,GAAK,EAAE,UAAU,OAAO,aAAa,CAAC,EACtHic,EAAO,UAAU,IAAI,aAAa,EAClC,KAAK,YAAYA,EAAO,YAAY,KAAI,CAAE,EAC1C,KAAK,YAAW,EACZ,KAAK,cACP,KAAK,aAAa,cAAc,IAAI,MAAM,QAAQ,CAAC,CAEvD,EAEA,KAAK,UAAU,iBAAiB,sCAAsC,EAAE,QAAQA,GAAU,CACxFA,EAAO,iBAAiB,QAAS,KAAK,mBAAmB,EACzDA,EAAO,0BAA4B,KAAK,mBAC1C,CAAC,EAED,KAAK,qBAAwB1b,GAAM,CACjCA,EAAE,gBAAe,EACjB,KAAK,YAAW,CAClB,EAEA,KAAK,QAAQ,iBAAiB,QAAS,KAAK,oBAAoB,EAEhE,KAAK,sBAAyBA,GAAM,CAC7B,KAAK,QAAQ,SAASA,EAAE,MAAM,GACjC,KAAK,YAAW,CAEpB,EAEI,OAAO,aACT,KAAK,uBAAyB,OAAO,aAAa,GAAG,SAAU,QAAS,KAAK,sBAAuB,CAAE,MAAO,KAAK,KAAK,CAAE,EAEzH,SAAS,iBAAiB,QAAS,KAAK,qBAAqB,EAG/D,KAAK,UAAU,MAAM,QAAU,OAC/B,KAAK,QAAQ,oBAAsB,GACrC,CAEA,YAAYuX,EAAM,CACZ,KAAK,UACP,KAAK,QAAQ,YAAcA,GAAQ,KAAK,QAAQ,YAEpD,CAEA,aAAc,CACZ,MAAM8D,EAAS,KAAK,UAAU,MAAM,UAAY,QAChD,KAAK,UAAU,MAAM,QAAUA,EAAS,OAAS,QAC7C,KAAK,OACP,KAAK,KAAK,MAAM,UAAYA,EAAS,eAAiB,kBAExD,KAAK,QAAQ,UAAU,OAAO,UAAW,CAACA,CAAM,CAClD,CAEA,aAAc,CACZ,KAAK,UAAU,MAAM,QAAU,OAC3B,KAAK,OACP,KAAK,KAAK,MAAM,UAAY,gBAE9B,KAAK,QAAQ,UAAU,OAAO,SAAS,CACzC,CAEA,SAAU,CACH,KAAK,QAAQ,sBAEd,KAAK,SAAW,KAAK,sBACvB,KAAK,QAAQ,oBAAoB,QAAS,KAAK,oBAAoB,EAGjE,KAAK,WACP,KAAK,UAAU,iBAAiB,sCAAsC,EAAE,QAAQK,GAAU,CACpFA,EAAO,2BACTA,EAAO,oBAAoB,QAASA,EAAO,yBAAyB,CAExE,CAAC,EAGC,KAAK,wBAA0B,KAAK,uBAAuB,YAC7D,KAAK,uBAAuB,cACnB,KAAK,uBACd,SAAS,oBAAoB,QAAS,KAAK,qBAAqB,EAGlE,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,qBAAuB,KAC5B,KAAK,oBAAsB,KAC3B,KAAK,QAAQ,oBAAsB,GACrC,CACF,CAEA,SAASC,GAAWtc,EAAS,CAC3B,MAAMuc,EAAS,IAAIH,GAAOpc,CAAO,EACjCuc,EAAO,KAAI,EACXvc,EAAQ,cAAgBuc,CAC1B,CAQA,SAASC,GAAcD,EAAQ,CACzBA,EAAO,gBACTA,EAAO,cAAc,UACrBA,EAAO,cAAgB,KAE3B,CAQI,OAAO,mBACT,OAAO,kBAAkB,SAAS,SAAUD,GAAYE,EAAa,EC7IvE,MAAMC,EAAW,CACf,YAAYzc,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,MAAQA,EAAQ,cAAc,OAAO,EAC1C,KAAK,KAAOA,EAAQ,cAAc,sBAAsB,EACxD,KAAK,WAAaA,EAAQ,cAAc,0BAA0B,EAClE,KAAK,MAAQ,cAAc,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAElE,KAAK,kBAAoB,KACzB,KAAK,mBAAqB,KAC1B,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,eAAiB,KACtB,KAAK,gBAAkB,IACzB,CAEA,MAAO,CACA,KAAK,aACN,KAAK,QAAQ,sBAEjB,KAAK,kBAAqBW,GAAM,KAAK,eAAeA,CAAC,EACrD,KAAK,mBAAsBA,GAAM,KAAK,eAAeA,CAAC,EAElD,KAAK,MACP,KAAK,KAAK,iBAAiB,QAAS,KAAK,iBAAiB,EAG5D,KAAK,MAAM,iBAAiB,QAAS,KAAK,kBAAkB,EAExD,OAAO,cACT,KAAK,uBAAyB,OAAO,aAAa,GAAG,SAAU,QAAUA,GAAM,KAAK,aAAaA,CAAC,EAAG,CAAE,MAAO,KAAK,KAAK,CAAE,EAC1H,KAAK,gBAAkB,OAAO,aAAa,GAAG,OAAQ,SAAU,IAAM,KAAK,cAAa,EAAI,CAAE,MAAO,KAAK,KAAK,CAAE,IAEjH,SAAS,iBAAiB,QAAUA,GAAM,KAAK,aAAaA,CAAC,CAAC,EAC9D,OAAO,iBAAiB,SAAU,IAAM,KAAK,cAAa,CAAE,EAC5D,KAAK,sBAAyBA,GAAM,KAAK,aAAaA,CAAC,EACvD,KAAK,eAAiB,IAAM,KAAK,cAAa,GAGhD,KAAK,QAAQ,oBAAsB,GACnC,KAAK,aAAY,GACnB,CAEA,mBAAoB,CAClB,MAAM+b,EAAa,KAAK,QAAQ,sBAAqB,EAC/CC,EAAe,KAAK,WAAW,sBAAqB,EAGpDC,EAFiB,OAAO,YAEMF,EAAW,OACzCG,EAAaH,EAAW,IACxBI,EAAiBH,EAAa,QAAU,IAE1CC,GAAcE,GAChB,KAAK,WAAW,MAAM,IAAM,mBAC5B,KAAK,WAAW,MAAM,OAAS,QACtBD,GAAcC,GACvB,KAAK,WAAW,MAAM,IAAM,OAC5B,KAAK,WAAW,MAAM,OAAS,qBAE/B,KAAK,WAAW,MAAM,IAAM,mBAC5B,KAAK,WAAW,MAAM,OAAS,OAEnC,CAEA,eAAenc,EAAG,CAChBA,EAAE,eAAc,EAChBA,EAAE,gBAAe,EAEjB,MAAMoc,EAAY,KAAK,WAAW,MAAM,UAAY,QAEpD,SAAS,iBAAiB,0BAA0B,EAAE,QAAQxR,GAAK,CACjEA,EAAE,MAAM,QAAU,OAClBA,EAAE,aAAa,SAAU,EAAE,CAC7B,CAAC,EAEIwR,IACH,KAAK,WAAW,MAAM,QAAU,QAChC,KAAK,WAAW,gBAAgB,QAAQ,EACxC,KAAK,kBAAiB,EAE1B,CAEA,aAAapc,EAAG,CACT,KAAK,QAAQ,SAASA,EAAE,MAAM,IACjC,KAAK,WAAW,MAAM,QAAU,OAChC,KAAK,WAAW,aAAa,SAAU,EAAE,EAE7C,CAEA,eAAgB,CACV,KAAK,WAAW,MAAM,UAAY,SACpC,KAAK,kBAAiB,CAE1B,CAEA,cAAe,CACb,MAAMqc,EAAW,KAAK,WAChBC,EAAQ,KAAK,MACbC,EAAUF,EAAS,cAAc,uBAAuB,EACxDG,EAASH,EAAS,cAAc,sBAAsB,EACtDI,EAAUJ,EAAS,cAAc,2BAA2B,EAC5DK,EAAUL,EAAS,cAAc,2BAA2B,EAElE,IAAIM,EAAc,IAAI,KACtB,GAAIL,EAAM,MAAO,CACf,MAAMnH,EAAQmH,EAAM,MAAM,MAAM,GAAG,EAC/BnH,EAAM,SAAW,IACnBwH,EAAc,IAAI,KAAKxH,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAI,EAAGA,EAAM,CAAC,CAAC,EAE3D,CAEA,SAASyH,GAAiB,CACxBJ,EAAO,iBAAiB,qBAAqB,EAAE,QAAQK,GAAS,CAC1DA,EAAM,kBACRA,EAAM,oBAAoB,QAASA,EAAM,gBAAgB,CAE7D,CAAC,EAEDL,EAAO,UAAY,GAEnB,MAAMjO,EAAOoO,EAAY,cACnBnO,EAAQmO,EAAY,WAE1BJ,EAAQ,YAAc,GAAGhO,CAAI,IAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAAEC,CAAK,CAAC,GAE5H,MAAMsO,EAAW,IAAI,KAAKvO,EAAMC,EAAO,CAAC,EAAE,SACpCuO,EAAc,IAAI,KAAKxO,EAAMC,EAAQ,EAAG,CAAC,EAAE,UAEjD,QAASjI,EAAI,EAAGA,EAAIuW,EAAUvW,IAAK,CACjC,MAAMyW,EAAW,SAAS,cAAc,MAAM,EAC9CA,EAAS,UAAY,4BACrBR,EAAO,YAAYQ,CAAQ,CAC7B,CAEA,QAASvO,EAAM,EAAGA,GAAOsO,EAAatO,IAAO,CAC3C,MAAMoO,EAAQ,SAAS,cAAc,QAAQ,EAC7CA,EAAM,UAAY,qBAClBA,EAAM,YAAcpO,EAEpB,MAAMwO,EAAU,GAAG1O,CAAI,IAAI,OAAOC,EAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOC,CAAG,EAAE,SAAS,EAAG,GAAG,CAAC,GACzF6N,EAAM,QAAUW,GAClBJ,EAAM,UAAU,IAAI,aAAa,EAGnC,MAAMK,EAAQ,IAAI,KACZC,EAAW,GAAGD,EAAM,YAAW,CAAE,IAAI,OAAOA,EAAM,SAAQ,EAAK,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAM,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GAChID,IAAYE,GACdN,EAAM,UAAU,IAAI,UAAU,EAGhC,MAAMO,EAAkB,IAAM,CAC5Bd,EAAM,MAAQW,EACdZ,EAAS,MAAM,QAAU,OACzBA,EAAS,aAAa,SAAU,EAAE,EAClCC,EAAM,cAAc,IAAI,MAAM,QAAQ,CAAC,CACzC,EAEAO,EAAM,iBAAiB,QAASO,CAAe,EAC/CP,EAAM,iBAAmBO,EAEzBZ,EAAO,YAAYK,CAAK,CAC1B,CACF,CAEA,MAAMQ,EAAoBrd,GAAM,CAC9BA,EAAE,gBAAe,EACjB2c,EAAY,SAASA,EAAY,SAAQ,EAAK,CAAC,EAC/CC,GACF,EAEMU,EAAoBtd,GAAM,CAC9BA,EAAE,gBAAe,EACjB2c,EAAY,SAASA,EAAY,SAAQ,EAAK,CAAC,EAC/CC,GACF,EAEIH,IACFA,EAAQ,iBAAiB,QAASY,CAAgB,EAClDZ,EAAQ,kBAAoBY,GAG1BX,IACFA,EAAQ,iBAAiB,QAASY,CAAgB,EAClDZ,EAAQ,kBAAoBY,GAG9BjB,EAAS,qBAAuB,GAChCO,GACF,CAEA,SAAU,CACR,GAAK,KAAK,QAAQ,oBAsBlB,IApBI,KAAK,MAAQ,KAAK,mBACpB,KAAK,KAAK,oBAAoB,QAAS,KAAK,iBAAiB,EAG3D,KAAK,OAAS,KAAK,oBACrB,KAAK,MAAM,oBAAoB,QAAS,KAAK,kBAAkB,EAG7D,KAAK,wBAA0B,KAAK,uBAAuB,YAC7D,KAAK,uBAAuB,cACnB,KAAK,uBACd,SAAS,oBAAoB,QAAS,KAAK,qBAAqB,EAG9D,KAAK,iBAAmB,KAAK,gBAAgB,YAC/C,KAAK,gBAAgB,cACZ,KAAK,gBACd,OAAO,oBAAoB,SAAU,KAAK,cAAc,EAGtD,KAAK,WAAY,CACnB,MAAMJ,EAAS,KAAK,WAAW,cAAc,sBAAsB,EAC/DA,GACFA,EAAO,iBAAiB,qBAAqB,EAAE,QAAQK,GAAS,CAC1DA,EAAM,kBACRA,EAAM,oBAAoB,QAASA,EAAM,gBAAgB,CAE7D,CAAC,EAEH,MAAMJ,EAAU,KAAK,WAAW,cAAc,2BAA2B,EACnEC,EAAU,KAAK,WAAW,cAAc,2BAA2B,EACrED,GAAWA,EAAQ,mBACrBA,EAAQ,oBAAoB,QAASA,EAAQ,iBAAiB,EAE5DC,GAAWA,EAAQ,mBACrBA,EAAQ,oBAAoB,QAASA,EAAQ,iBAAiB,CAElE,CAEA,KAAK,sBAAwB,KAC7B,KAAK,eAAiB,KACtB,KAAK,uBAAyB,KAC9B,KAAK,gBAAkB,KACvB,KAAK,kBAAoB,KACzB,KAAK,mBAAqB,KAC1B,KAAK,QAAQ,oBAAsB,GACrC,CACF,CAEA,SAASa,GAAele,EAAS,CAC/B,MAAMme,EAAS,IAAI1B,GAAWzc,CAAO,EACrCme,EAAO,KAAI,EACXne,EAAQ,kBAAoBme,CAC9B,CAQA,SAASC,GAAkBD,EAAQ,CAC7BA,EAAO,oBACTA,EAAO,kBAAkB,UACzBA,EAAO,kBAAoB,KAE/B,CAQI,OAAO,mBACT,OAAO,kBAAkB,SAAS,aAAcD,GAAgBE,EAAiB,EC5QnF,MAAMC,EAAW,CACf,YAAYre,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,MAAQA,EAAQ,cAAc,OAAO,EAC1C,KAAK,UAAYA,EAAQ,cAAc,4BAA4B,EACnE,KAAK,QAAU,KACf,KAAK,MAAQ,cAAc,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAElE,KAAK,uBAAyB,KAC9B,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,eAAiB,KACtB,KAAK,gBAAkB,KAEvB,KAAK,aAAe,GACpB,KAAK,eAAiB,CACxB,CAEA,MAAO,CACD,KAAK,QAAQ,sBAEjB,KAAK,uBAA0BW,GAAM,CACnCA,EAAE,gBAAe,EACb,KAAK,SAAW,KAAK,QAAQ,MAAM,UAAY,QACjD,KAAK,QAAQ,MAAM,QAAU,OAE7B,KAAK,eAAc,CAEvB,EAEA,KAAK,UAAU,iBAAiB,QAAS,KAAK,sBAAsB,EAEhE,OAAO,cACT,KAAK,uBAAyB,OAAO,aAAa,GAAG,SAAU,QAAUA,GAAM,KAAK,eAAeA,CAAC,EAAG,CAAE,MAAO,KAAK,KAAK,CAAE,EAC5H,KAAK,gBAAkB,OAAO,aAAa,GAAG,OAAQ,SAAU,IAAM,KAAK,cAAa,EAAI,CAAE,MAAO,KAAK,KAAK,CAAE,IAEjH,SAAS,iBAAiB,QAAUA,GAAM,KAAK,eAAeA,CAAC,CAAC,EAChE,OAAO,iBAAiB,SAAU,IAAM,KAAK,cAAa,CAAE,EAC5D,KAAK,sBAAyBA,GAAM,KAAK,eAAeA,CAAC,EACzD,KAAK,eAAiB,IAAM,KAAK,cAAa,GAGhD,KAAK,QAAQ,oBAAsB,GACrC,CAEA,mBAAoB,CAClB,GAAI,CAAC,KAAK,QAAS,OAEnB,MAAM+b,EAAa,KAAK,QAAQ,sBAAqB,EAC/C4B,EAAY,KAAK,QAAQ,sBAAqB,EAG9C1B,EAFiB,OAAO,YAEMF,EAAW,OACzCG,EAAaH,EAAW,IACxB6B,EAAcD,EAAU,QAAU,IAEpC1B,GAAc2B,GAChB,KAAK,QAAQ,MAAM,IAAM,mBACzB,KAAK,QAAQ,MAAM,OAAS,QACnB1B,GAAc0B,GACvB,KAAK,QAAQ,MAAM,IAAM,OACzB,KAAK,QAAQ,MAAM,OAAS,qBAE5B,KAAK,QAAQ,MAAM,IAAM,mBACzB,KAAK,QAAQ,MAAM,OAAS,OAEhC,CAEA,gBAAiB,CACf,GAAI,KAAK,QAAS,CAChB,KAAK,QAAQ,MAAM,QAAU,QAC7B,KAAK,kBAAiB,EACtB,MACF,CAyBA,GAvBA,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,uBACzB,KAAK,QAAQ,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAmBzB,KAAK,QAAQ,YAAY,KAAK,OAAO,EAEjC,KAAK,MAAM,MAAO,CACpB,MAAMC,EAAY,KAAK,MAAM,MAAM,MAAM,GAAG,EACxCA,EAAU,QAAU,IACtB,KAAK,aAAe,SAASA,EAAU,CAAC,CAAC,GAAK,EAC9C,KAAK,eAAiB,SAASA,EAAU,CAAC,CAAC,GAAK,EAEpD,CAEA,MAAMC,EAAc,KAAK,QAAQ,cAAc,8BAA8B,EACvEC,EAAgB,KAAK,QAAQ,cAAc,gCAAgC,EAEjF,SAASC,GAAgB,CACvBF,EAAY,YAAc,OAAO,KAAK,YAAY,EAAE,SAAS,EAAG,GAAG,EACnEC,EAAc,YAAc,OAAO,KAAK,cAAc,EAAE,SAAS,EAAG,GAAG,CACzE,CAEA,SAASE,GAAc,CACrB,KAAK,MAAM,MAAQ,GAAG,OAAO,KAAK,YAAY,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAO,KAAK,cAAc,EAAE,SAAS,EAAG,GAAG,CAAC,EAClH,CAEA,SAASC,GAAqB,CAC5BD,EAAY,KAAK,IAAI,EACrB,KAAK,QAAQ,MAAM,QAAU,OAC7B,KAAK,MAAM,cAAc,IAAI,MAAM,QAAQ,CAAC,CAC9C,CAEA,MAAME,EAAW,KAAK,QAAQ,cAAc,oBAAoB,EAC1DC,EAAa,KAAK,QAAQ,cAAc,sBAAsB,EAEpE,QAAS7X,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3B,MAAMyT,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,UAAY,sBAChBA,EAAI,YAAc,OAAOzT,CAAC,EAAE,SAAS,EAAG,GAAG,EACvCA,IAAM,KAAK,cAAcyT,EAAI,UAAU,IAAI,aAAa,EAC5DA,EAAI,iBAAiB,QAAS,IAAM,CAClCmE,EAAS,iBAAiB,sBAAsB,EAAE,QAAQvV,GAAKA,EAAE,UAAU,OAAO,aAAa,CAAC,EAChGoR,EAAI,UAAU,IAAI,aAAa,EAC/B,KAAK,aAAezT,EACpByX,EAAc,KAAK,IAAI,EACvBE,EAAmB,KAAK,IAAI,CAC9B,CAAC,EACDC,EAAS,YAAYnE,CAAG,CAC1B,CAEA,QAASzT,EAAI,EAAGA,EAAI,GAAIA,GAAK,EAAG,CAC9B,MAAMyT,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,UAAY,sBAChBA,EAAI,YAAc,OAAOzT,CAAC,EAAE,SAAS,EAAG,GAAG,EACvCA,IAAM,KAAK,gBAAgByT,EAAI,UAAU,IAAI,aAAa,EAC9DA,EAAI,iBAAiB,QAAS,IAAM,CAClCoE,EAAW,iBAAiB,sBAAsB,EAAE,QAAQxV,GAAKA,EAAE,UAAU,OAAO,aAAa,CAAC,EAClGoR,EAAI,UAAU,IAAI,aAAa,EAC/B,KAAK,eAAiBzT,EACtByX,EAAc,KAAK,IAAI,EACvBE,EAAmB,KAAK,IAAI,CAC9B,CAAC,EACDE,EAAW,YAAYpE,CAAG,CAC5B,CAEA,KAAK,QAAQ,iBAAiB,QAAUha,GAAM,CAC5CA,EAAE,gBAAe,CACnB,CAAC,EAEDge,EAAc,KAAK,IAAI,EACvBC,EAAY,KAAK,IAAI,EAErB,WAAW,IAAM,CACf,KAAK,kBAAiB,CACxB,EAAG,CAAC,CACN,CAEA,eAAeje,EAAG,CACZ,KAAK,SAAW,KAAK,QAAQ,MAAM,UAAY,UAC5C,KAAK,QAAQ,SAASA,EAAE,MAAM,IACjC,KAAK,QAAQ,MAAM,QAAU,QAGnC,CAEA,eAAgB,CACV,KAAK,SAAW,KAAK,QAAQ,MAAM,UAAY,SACjD,KAAK,kBAAiB,CAE1B,CAEA,SAAU,CACH,KAAK,QAAQ,sBAEd,KAAK,WAAa,KAAK,wBACzB,KAAK,UAAU,oBAAoB,QAAS,KAAK,sBAAsB,EAGrE,KAAK,wBAA0B,KAAK,uBAAuB,YAC7D,KAAK,uBAAuB,cACnB,KAAK,uBACd,SAAS,oBAAoB,QAAS,KAAK,qBAAqB,EAG9D,KAAK,iBAAmB,KAAK,gBAAgB,YAC/C,KAAK,gBAAgB,cACZ,KAAK,gBACd,OAAO,oBAAoB,SAAU,KAAK,cAAc,EAGtD,KAAK,UACP,KAAK,QAAQ,SACb,KAAK,QAAU,MAGjB,KAAK,uBAAyB,KAC9B,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,eAAiB,KACtB,KAAK,gBAAkB,KACvB,KAAK,QAAQ,oBAAsB,GACrC,CACF,CAEA,SAASqe,GAAehf,EAAS,CAC/B,MAAMme,EAAS,IAAIE,GAAWre,CAAO,EACrCme,EAAO,KAAI,EACXne,EAAQ,kBAAoBme,CAC9B,CAQA,SAASc,GAAkBjf,EAAS,CAC9BA,EAAQ,oBACVA,EAAQ,kBAAkB,UAC1BA,EAAQ,kBAAoB,KAEhC,CAEI,OAAO,mBACT,OAAO,kBAAkB,SAAS,aAAcgf,GAAgBC,EAAiB,EC5OnF,MAAMC,EAAO,CACT,YAAYlf,EAAS,CAOjB,GANA,KAAK,QAAUA,EACf,KAAK,MAAQA,EAAQ,cAAc,mBAAmB,EACtD,KAAK,KAAOA,EAAQ,cAAc,kBAAkB,EACpD,KAAK,MAAQA,EAAQ,cAAc,mBAAmB,EACtD,KAAK,QAAUA,EAAQ,cAAc,mBAAmB,EAEpD,CAAC,KAAK,OAAS,CAAC,KAAK,MAAQ,CAAC,KAAK,MACnC,MAAM,IAAI,MAAM,mCAAmC,EAGvD,KAAK,YAAW,EAChB,KAAK,aAAY,CACrB,CAEA,aAAc,CACV,KAAK,aAAe,IAAM,CACtB,MAAMI,EAAQ,KAAK,MAAM,MACnBmO,EAAM,KAAK,MAAM,KAAO,EACxB9D,EAAM,KAAK,MAAM,KAAO,IACxB0U,GAAe/e,EAAQmO,IAAQ9D,EAAM8D,GAAQ,IAEnD,KAAK,KAAK,MAAM,MAAQ,GAAG4Q,CAAU,IACjC,KAAK,UACL,KAAK,QAAQ,YAAc/e,GAE/B,KAAK,QAAQ,aAAa,gBAAiBA,CAAK,CACpD,EAEA,KAAK,MAAM,iBAAiB,QAAS,KAAK,YAAY,EACtD,KAAK,MAAM,iBAAiB,SAAU,KAAK,YAAY,EAEvD,KAAK,WAAa,CACd,CAAE,GAAI,KAAK,MAAO,MAAO,QAAS,QAAS,KAAK,YAAY,EAC5D,CAAE,GAAI,KAAK,MAAO,MAAO,SAAU,QAAS,KAAK,YAAY,CACzE,CACI,CAEA,SAAU,CACN,KAAK,YAAY,QAAQ,CAAC,CAAE,GAAAgf,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CACjD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACzC,CAAC,EACD,KAAK,WAAa,KAClB,KAAK,MAAQ,KACb,KAAK,KAAO,KACZ,KAAK,MAAQ,KACb,KAAK,QAAU,KACf,KAAK,QAAU,IACnB,CAEA,SAASN,EAAO,CACR,KAAK,QACL,KAAK,MAAM,MAAQA,EACnB,KAAK,aAAY,EAEzB,CAEA,UAAW,CACP,OAAO,KAAK,OAAO,KACvB,CACJ,CAEA,SAASkf,GAAWtf,EAAS,CACzB,GAAI,CAAAA,EAAQ,oBAEZ,GAAI,CACA,MAAMuf,EAAS,IAAIL,GAAOlf,CAAO,EACjCA,EAAQ,iBAAmBuf,EAC3Bvf,EAAQ,oBAAsB,EAClC,OAASe,EAAO,CACZ,QAAQ,MAAM,+BAAgCA,CAAK,CACvD,CACJ,CAEA,SAASye,GAAcxf,EAAS,CAC5B,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAEhDA,EAAQ,iBAChB,QAAO,EAEdA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAQI,OAAO,mBACP,OAAO,kBAAkB,SAAS,SAAUsf,GAAYE,EAAa,mEC5FzE,MAAMC,CAAS,CACb,YAAYzf,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,MAAQA,EAAQ,cAAc,qBAAqB,EACxD,KAAK,MAAQA,EAAQ,iBAAiB,oBAAoB,EAC1D,KAAK,QAAUA,EAAQ,cAAc,oBAAoB,EACzD,KAAK,QAAUA,EAAQ,cAAc,oBAAoB,EACzD,KAAK,WAAaA,EAAQ,iBAAiB,yBAAyB,EACpE,KAAK,QAAUA,EAAQ,cAAc,oBAAoB,EAEzD,KAAK,aAAe,EACpB,KAAK,WAAa,KAAK,MAAM,OAC7B,KAAK,cAAgB,KACrB,KAAK,cAAgB,GAErB,KAAK,mBAAqB,IAAM,KAAK,aAAY,EACjD,KAAK,mBAAqB,IAAM,CAAM,KAAK,eAAe,KAAK,iBAE/D,KAAK,KAAI,CACb,CAEE,MAAO,CACL,KAAK,kBAAoB,IAAM,KAAK,KAAI,EACxC,KAAK,kBAAoB,IAAM,KAAK,KAAI,EACxC,KAAK,kBAAoB,IAAM,KAAK,eAAc,EAClD,KAAK,wBAA0B,GAE3B,KAAK,SACP,KAAK,QAAQ,iBAAiB,QAAS,KAAK,iBAAiB,EAE3D,KAAK,SACP,KAAK,QAAQ,iBAAiB,QAAS,KAAK,iBAAiB,EAG/D,KAAK,WAAW,QAAQ,CAAC0f,EAAW5b,IAAU,CAC5C,MAAMpD,EAAU,IAAM,KAAK,KAAKoD,CAAK,EACrC,KAAK,wBAAwB,KAAKpD,CAAO,EACzCgf,EAAU,iBAAiB,QAAShf,CAAO,CACjD,CAAK,EAEG,KAAK,SACP,KAAK,QAAQ,iBAAiB,QAAS,KAAK,iBAAiB,EAG/D,KAAK,iBAAgB,EACrB,KAAK,cAAa,EAElB,KAAK,QAAQ,iBAAiB,aAAc,KAAK,kBAAkB,EACnE,KAAK,QAAQ,iBAAiB,aAAc,KAAK,kBAAkB,CACvE,CAEE,KAAKoD,EAAO,CACV,GAAIA,EAAQ,GAAKA,GAAS,KAAK,WAAY,OAE3C,KAAK,aAAeA,EACpB,MAAM6b,EAAS,CAAC7b,EAAQ,IACxB,KAAK,MAAM,MAAM,UAAY,cAAc6b,CAAM,KACjD,KAAK,iBAAgB,CACzB,CAEE,MAAO,CACL,MAAMC,EAAW,KAAK,aAAe,EAAI,KAAK,aAAe,EAAI,KAAK,WAAa,EACnF,KAAK,KAAKA,CAAQ,CACtB,CAEE,MAAO,CACL,MAAMA,EAAW,KAAK,aAAe,KAAK,WAAa,EAAI,KAAK,aAAe,EAAI,EACnF,KAAK,KAAKA,CAAQ,CACtB,CAEE,kBAAmB,CACjB,KAAK,WAAW,QAAQ,CAACF,EAAW5b,IAAU,CACxCA,IAAU,KAAK,aACjB4b,EAAU,UAAU,IAAI,WAAW,EAEnCA,EAAU,UAAU,OAAO,WAAW,CAE9C,CAAK,CACL,CAEE,eAAgB,CACV,KAAK,YAAc,IACvB,KAAK,aAAY,EACjB,KAAK,cAAgB,GACjB,KAAK,SACP,KAAK,QAAQ,UAAU,IAAI,WAAW,EAExC,KAAK,cAAgB,YAAY,IAAM,KAAK,KAAI,EAAI,GAAI,EAC5D,CAEE,cAAe,CACT,KAAK,gBACP,cAAc,KAAK,aAAa,EAChC,KAAK,cAAgB,MAEnB,KAAK,SACP,KAAK,QAAQ,UAAU,OAAO,WAAW,CAE/C,CAEE,gBAAiB,CACX,KAAK,eACP,KAAK,cAAgB,GACrB,KAAK,aAAY,GAEjB,KAAK,cAAa,CAExB,CAEE,SAAU,CACR,KAAK,aAAY,EACjB,KAAK,QAAQ,oBAAoB,aAAc,KAAK,kBAAkB,EACtE,KAAK,QAAQ,oBAAoB,aAAc,KAAK,kBAAkB,EAElE,KAAK,SAAW,KAAK,mBACvB,KAAK,QAAQ,oBAAoB,QAAS,KAAK,iBAAiB,EAE9D,KAAK,SAAW,KAAK,mBACvB,KAAK,QAAQ,oBAAoB,QAAS,KAAK,iBAAiB,EAE9D,KAAK,SAAW,KAAK,mBACvB,KAAK,QAAQ,oBAAoB,QAAS,KAAK,iBAAiB,EAGlE,KAAK,WAAW,QAAQ,CAACA,EAAW5b,IAAU,CAC5C,MAAMpD,EAAU,KAAK,wBAAwBoD,CAAK,EAC9CpD,GACFgf,EAAU,oBAAoB,QAAShf,CAAO,CAEtD,CAAK,EAED,KAAK,kBAAoB,KACzB,KAAK,kBAAoB,KACzB,KAAK,kBAAoB,KACzB,KAAK,wBAA0B,IACnC,EAGA,SAASmf,EAAa7f,EAAS,CAC7B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM8f,EAAW,IAAIL,EAASzf,CAAO,EACrCA,EAAQ,iBAAmB8f,EAC3B9f,EAAQ,oBAAsB,EAChC,CAEA,SAAS+f,EAAc1d,EAAO,SAAU,CACtCA,EAAK,iBAAiB,cAAc,EAAE,QAAQyd,GAAY,CACxDD,EAAaC,CAAQ,CACzB,CAAG,CACH,CAEA,SAASE,EAAgBhgB,EAAS,CAChC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEqC+B,EAAO,QAC1CA,EAAA,QAAiB,CAAE,SAAA0d,EAAU,aAAAI,EAAc,cAAAE,EAAe,gBAAAC,IAE1D,OAAO,SAAWP,EAClB,OAAO,aAAeI,EACtB,OAAO,cAAgBE,EAEnB,OAAO,mBACT,OAAO,kBAAkB,SAAS,WAAYF,EAAcG,CAAe,uBC1K/E,MAAMC,EAAO,CACT,YAAYjgB,EAAS,CACjB,KAAK,QAAUA,EACf,KAAK,KAAOA,EAAQ,cAAc,iBAAiB,EACnD,KAAK,SAAWA,EAAQ,cAAc,YAAY,EAClD,KAAK,YAAW,CACpB,CAEA,aAAc,CACV,MAAMkgB,EAAW,KAAK,MAAM,cAAc,mBAAmB,EACvDC,EAAY,KAAK,MAAM,cAAc,mCAAmC,EACxEC,EAAa,KAAK,MAAM,cAAc,mCAAmC,EAE/E,KAAK,YAAc,IAAM,CACjB,KAAK,MACL,KAAK,KAAK,UAAU,OAAO,YAAY,EAEvC,KAAK,UACL,KAAK,SAAS,UAAU,OAAO,YAAY,CAEnD,EAEA,KAAK,gBAAmBzf,GAAM,CACtBA,EAAE,SAAW,KAAK,MAClB,KAAK,YAAW,CAExB,EAEI,KAAK,MACL,KAAK,KAAK,iBAAiB,QAAS,KAAK,eAAe,EAGxDuf,GACAA,EAAS,iBAAiB,QAAS,KAAK,WAAW,EAGnDC,GACAA,EAAU,iBAAiB,QAAS,KAAK,WAAW,EAGpDC,GACAA,EAAW,iBAAiB,QAAS,KAAK,WAAW,EAGzD,KAAK,WAAa,CACd,CAAE,GAAI,KAAK,KAAM,MAAO,QAAS,QAAS,KAAK,eAAe,EAC9D,CAAE,GAAIF,EAAU,MAAO,QAAS,QAAS,KAAK,WAAW,EACzD,CAAE,GAAIC,EAAW,MAAO,QAAS,QAAS,KAAK,WAAW,EAC1D,CAAE,GAAIC,EAAY,MAAO,QAAS,QAAS,KAAK,WAAW,CACvE,EAAU,OAAO7T,GAAQA,EAAK,EAAE,CAC5B,CAEA,SAAU,CACN,KAAK,YAAY,QAAQ,CAAC,CAAE,GAAA6S,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CACjD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACzC,CAAC,EACD,KAAK,WAAa,KAClB,KAAK,KAAO,KACZ,KAAK,SAAW,KAChB,KAAK,QAAU,IACnB,CAEA,MAAO,CACC,KAAK,MACL,KAAK,KAAK,UAAU,IAAI,YAAY,EAEpC,KAAK,UACL,KAAK,SAAS,UAAU,IAAI,YAAY,CAEhD,CAEA,OAAQ,CACJ,KAAK,YAAW,CACpB,CACJ,CAEA,SAAS2f,GAAWrgB,EAAS,CACzB,GAAIA,EAAQ,oBAAqB,OAEjC,MAAMsgB,EAAS,IAAIL,GAAOjgB,CAAO,EACjCA,EAAQ,iBAAmBsgB,EAC3BtgB,EAAQ,oBAAsB,EAClC,CAEA,SAASugB,GAAcvgB,EAAS,CAC5B,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAEhDA,EAAQ,iBAChB,QAAO,EAEdA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAuBI,OAAO,mBACP,OAAO,kBAAkB,SAAS,SAAUqgB,GAAYE,EAAa,mECpHzE,MAAMC,CAAM,CACV,YAAYxgB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,KAAOA,EAAQ,cAAc,gBAAgB,EAClD,KAAK,MAAQA,EAAQ,cAAc,WAAW,EAC9C,KAAK,SAAWA,EAAQ,cAAc,kBAAkB,EAExD,KAAK,gBAAmBW,GAAM,CACxBA,EAAE,MAAQ,UAAY,KAAK,UAAS,GACtC,KAAK,MAAK,CAElB,EAEI,KAAK,sBAAwB,IAAM,KAAK,MAAK,EAE7C,KAAK,kBAAqBA,GAAM,CAC1BA,EAAE,SAAW,KAAK,MACpB,KAAK,MAAK,CAElB,EAEI,KAAK,KAAI,CACb,CAEE,MAAO,CACD,KAAK,UACP,KAAK,SAAS,iBAAiB,QAAS,KAAK,qBAAqB,EAGhE,KAAK,MACP,KAAK,KAAK,iBAAiB,QAAS,KAAK,iBAAiB,EAG5D,SAAS,iBAAiB,UAAW,KAAK,eAAe,CAC7D,CAEE,MAAO,CACL,KAAK,KAAK,UAAU,IAAI,YAAY,EACpC6f,EAAM,YAAcA,EAAM,YAAc,GAAK,EAC7C,SAAS,KAAK,MAAM,SAAW,QACnC,CAEE,OAAQ,CACN,KAAK,KAAK,UAAU,OAAO,YAAY,EACvCA,EAAM,WAAa,KAAK,IAAI,GAAIA,EAAM,YAAc,GAAK,CAAC,EACtDA,EAAM,aAAe,IACvB,SAAS,KAAK,MAAM,SAAW,GAErC,CAEE,WAAY,CACV,OAAO,KAAK,KAAK,UAAU,SAAS,YAAY,CACpD,CAEE,SAAU,CACR,SAAS,oBAAoB,UAAW,KAAK,eAAe,EACxD,KAAK,UACP,KAAK,SAAS,oBAAoB,QAAS,KAAK,qBAAqB,EAEnE,KAAK,MACP,KAAK,KAAK,oBAAoB,QAAS,KAAK,iBAAiB,EAE3D,KAAK,aACP,KAAK,MAAK,CAEhB,EAGAA,EAAM,WAAa,EAEnB,SAASC,EAAYvd,EAAU,GAAI,CACjC,KAAM,CACJ,MAAAwd,EAAQ,GACR,QAAAC,EAAU,GACV,MAAAC,EAAQ,QACR,UAAAC,EACA,SAAAC,GACE5d,EAEEiB,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,qBACtBA,EAAU,UAAY;AAAA;AAAA,gDAEwByc,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAU3CC,GAAaC,EAAW;AAAA;AAAA,YAEtBA,EAAW,yEAA2E,EAAE;AAAA,YACxFD,EAAY,sEAAwE,EAAE;AAAA;AAAA,UAEtF,EAAE;AAAA;AAAA;AAAA,IAKZ,SAAS,KAAK,YAAY1c,CAAS,EAEnC,MAAM4c,EAAQ,IAAIP,EAAMrc,CAAS,EAE3B+Y,EAAU/Y,EAAU,cAAc,kBAAkB,EACtD+Y,IAASA,EAAQ,YAAcwD,GACnC,MAAMM,EAAS7c,EAAU,cAAc,iBAAiB,EACpD6c,IAAQA,EAAO,YAAcL,GAEjC,MAAMP,EAAajc,EAAU,cAAc,sBAAsB,EAC3Dgc,EAAYhc,EAAU,cAAc,qBAAqB,EAEzD8c,EAAiB,IAAM,CACrBJ,GAAWA,IACfE,EAAM,MAAK,CACjB,EAEUG,EAAgB,IAAM,CACtBJ,GAAUA,IACdC,EAAM,MAAK,CACjB,EAEQX,GACFA,EAAW,iBAAiB,QAASa,CAAc,EAGjDd,GACFA,EAAU,iBAAiB,QAASe,CAAa,EAGnD,MAAMC,EAAkB,IAAM,CAC5B,WAAW,IAAM,CACXf,GACFA,EAAW,oBAAoB,QAASa,CAAc,EAEpDd,GACFA,EAAU,oBAAoB,QAASe,CAAa,EAEtDH,EAAM,QAAO,EACb5c,EAAU,OAAM,CACxB,EAAS,GAAG,CACZ,EAEUid,EAAgBL,EAAM,MAAM,KAAKA,CAAK,EAC5C,OAAAA,EAAM,MAAQ,IAAM,CAClBK,IACAD,GACN,EAEEJ,EAAM,KAAI,EAEHA,CACT,CAEA,SAASM,EAAUrhB,EAAS,CAC1B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM+gB,EAAQ,IAAIP,EAAMxgB,CAAO,EAC/BA,EAAQ,iBAAmB+gB,EAC3B/gB,EAAQ,oBAAsB,EAChC,CAEA,SAASshB,EAAathB,EAAS,CAC7B,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAEjDA,EAAQ,iBAChB,QAAO,EAEbA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEA,SAASuhB,GAAa,CACpB,SAAS,iBAAiB,qBAAqB,EAAE,QAAQpd,GAAa,CACpEkd,EAAUld,CAAS,CACvB,CAAG,CACH,CAEqCpC,EAAO,QAC1CA,EAAA,QAAiB,CAAE,MAAAye,EAAO,WAAAe,EAAY,UAAAF,EAAW,aAAAC,EAAc,YAAAb,IAE/D,OAAO,UAAYY,EACnB,OAAO,aAAeC,GAGpB,OAAO,mBACT,OAAO,kBAAkB,SAAS,QAASD,EAAWC,CAAY,uFC7LpE,MAAME,CAAO,CACX,OAAO,OAAOte,EAAU,GAAI,CAC1B,OAAO,KAAK,QAAQ,CAAE,KAAM,SAAU,GAAGA,CAAO,CAAE,CACtD,CAEE,OAAO,QAAQA,EAAU,GAAI,CAC3B,OAAO,KAAK,QAAQ,CAAE,KAAM,UAAW,GAAGA,CAAO,CAAE,CACvD,CAEE,OAAO,QAAQA,EAAU,GAAI,CAC3B,OAAO,KAAK,QAAQ,CAAE,KAAM,UAAW,GAAGA,CAAO,CAAE,CACvD,CAEE,OAAO,MAAMA,EAAU,GAAI,CACzB,OAAO,KAAK,QAAQ,CAAE,KAAM,QAAS,GAAGA,CAAO,CAAE,CACrD,CAEE,OAAO,KAAKA,EAAU,GAAI,CACxB,OAAO,KAAK,QAAQ,CAAE,KAAM,OAAQ,GAAGA,CAAO,CAAE,CACpD,CAEE,OAAO,QAAQA,EAAU,GAAI,CAC3B,OAAO,KAAK,QAAQ,CAAE,KAAM,UAAW,GAAGA,CAAO,CAAE,CACvD,CAEE,OAAO,QAAQA,EAAS,CACtB,KAAM,CACJ,KAAA0E,EAAO,SACP,MAAA8Y,EAAQ,GACR,QAAAC,EAAU,GACV,UAAAE,EACA,SAAAC,GACE5d,EAEEue,EAAQ,CACZ,OAAQ,2NACR,QAAS,+IACT,QAAS,6OACT,MAAO,sNACP,KAAM,2NACN,QAAS,4OACf,EAEUtd,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,qBACtBA,EAAU,UAAY;AAAA;AAAA;AAAA;AAAA,2DAIiCyD,CAAI,KAAK6Z,EAAM7Z,CAAI,CAAC;AAAA,cACjE8Y,EAAQ,uCAAyC,EAAE;AAAA;AAAA;AAAA,gBAGjD9Y,IAAS,WAAakZ,EAAW,0EAA4E,EAAE;AAAA,sCACzFlZ,IAAS,UAAY,gBAAkB,eAAe;AAAA,kBAC1EA,IAAS,UAAY,UAAY,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQnD,SAAS,KAAK,YAAYzD,CAAS,EAE/Buc,IAAOvc,EAAU,cAAc,mBAAmB,EAAE,YAAcuc,GACtEvc,EAAU,cAAc,qBAAqB,EAAE,YAAcwc,EAE7D,MAAMe,EAAOvd,EAAU,cAAc,gBAAgB,EAC/Cic,EAAajc,EAAU,cAAc,uBAAuB,EAC5Dgc,EAAYhc,EAAU,cAAc,sBAAsB,EAE1Dwd,EAAiB,SAAShhB,EAAG,CAC7BA,EAAE,MAAQ,WACRmgB,GAAUA,IACdc,IAER,EAEUC,EAAmB,SAASlhB,EAAG,CAC/BA,EAAE,SAAW+gB,IACXZ,GAAUA,IACdc,IAER,EAEUE,EAAsB,UAAW,CACjCjB,GAAWA,IACfe,GACN,EAEUG,EAAqB,UAAW,CAChCjB,GAAUA,IACdc,GACN,EAEUA,EAAQ,IAAM,CAClBF,EAAK,UAAU,OAAO,YAAY,EAClC,SAAS,KAAK,MAAM,SAAW,GAC/B,SAAS,oBAAoB,UAAWC,CAAc,EACtDD,EAAK,oBAAoB,QAASG,CAAgB,EAC9CzB,GACFA,EAAW,oBAAoB,QAAS0B,CAAmB,EAEzD3B,GACFA,EAAU,oBAAoB,QAAS4B,CAAkB,EAE3D,WAAW,IAAM5d,EAAU,OAAM,EAAI,GAAG,CAC9C,EAEI,OAAAud,EAAK,UAAU,IAAI,YAAY,EAC/B,SAAS,KAAK,MAAM,SAAW,SAE3BtB,GACFA,EAAW,iBAAiB,QAAS0B,CAAmB,EAGtD3B,GACFA,EAAU,iBAAiB,QAAS4B,CAAkB,EAGxDL,EAAK,iBAAiB,QAASG,CAAgB,EAC/C,SAAS,iBAAiB,UAAWF,CAAc,EAE5C,CAAE,MAAAC,CAAK,CAClB,EAGqC7f,EAAO,UAC1CA,EAAA,QAAiByf,wFCjInB,MAAMQ,CAAW,CACf,YAAYhiB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,SAAWA,EAAQ,cAAc,0BAA0B,EAChE,KAAK,MAAQA,EAAQ,cAAc,uBAAuB,EAC1D,KAAK,KAAOA,EAAQ,cAAc,sBAAsB,EACxD,KAAK,SAAWA,EAAQ,cAAc,yBAAyB,EAE/D,KAAK,MAAQ,GACb,KAAK,QAAU,SAASA,EAAQ,aAAa,eAAe,CAAC,GAAK,EAClE,KAAK,SAAW,SAASA,EAAQ,aAAa,gBAAgB,CAAC,GAAK,EACpE,KAAK,WAAa,GAElB,KAAK,KAAI,CACb,CAEE,MAAO,CACL,KAAK,WAAU,CACnB,CAEE,YAAa,CACX,MAAMiiB,EAAgBthB,GAAM,CACtBA,EAAE,SAAW,KAAK,OAAS,KAAK,MAAM,SAASA,EAAE,MAAM,GAC3D,KAAK,MAAM,OACjB,EAEUuhB,EAAiBvhB,GAAM,CAC3B,MAAMwhB,EAAQ,MAAM,KAAKxhB,EAAE,OAAO,KAAK,EACvC,KAAK,SAASwhB,CAAK,EACnBxhB,EAAE,OAAO,MAAQ,EACvB,EAEUyhB,EAAmBzhB,GAAM,CAC7BA,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,KAAK,SAAS,UAAU,IAAI,aAAa,CAC/C,EAEU0hB,EAAoB1hB,GAAM,CAC9BA,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,KAAK,SAAS,UAAU,OAAO,aAAa,CAClD,EAEU2hB,EAAe3hB,GAAM,CACzBA,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB,KAAK,SAAS,UAAU,OAAO,aAAa,EAE5C,MAAMwhB,EAAQ,MAAM,KAAKxhB,EAAE,aAAa,KAAK,EAC7C,KAAK,SAASwhB,CAAK,CACzB,EAEI,KAAK,SAAS,iBAAiB,QAASF,CAAY,EACpD,KAAK,MAAM,iBAAiB,SAAUC,CAAa,EACnD,KAAK,SAAS,iBAAiB,WAAYE,CAAe,EAC1D,KAAK,SAAS,iBAAiB,YAAaC,CAAgB,EAC5D,KAAK,SAAS,iBAAiB,OAAQC,CAAW,EAElD,KAAK,WAAW,KACd,CAAE,GAAI,KAAK,SAAU,MAAO,QAAS,QAASL,CAAY,EAC1D,CAAE,GAAI,KAAK,MAAO,MAAO,SAAU,QAASC,CAAa,EACzD,CAAE,GAAI,KAAK,SAAU,MAAO,WAAY,QAASE,CAAe,EAChE,CAAE,GAAI,KAAK,SAAU,MAAO,YAAa,QAASC,CAAgB,EAClE,CAAE,GAAI,KAAK,SAAU,MAAO,OAAQ,QAASC,CAAW,CAC9D,CACA,CAEE,SAASH,EAAO,CACdA,EAAM,QAAQzb,GAAQ,CACpB,GAAI,KAAK,SAAW,GAAK,KAAK,MAAM,QAAU,KAAK,SAAU,CAC3D,KAAK,UAAU,WAAW,KAAK,QAAQ,gBAAgB,EACvD,MACR,CACU,KAAK,YAAYA,CAAI,IACvB,KAAK,MAAM,KAAKA,CAAI,EACpB,KAAK,eAAeA,CAAI,EACxB,KAAK,YAAYA,CAAI,EAE7B,CAAK,EAED,KAAK,eAAc,CACvB,CAEE,YAAYA,EAAM,CAChB,MAAM6b,EAAS,KAAK,MAAM,aAAa,QAAQ,EAC/C,GAAIA,GAAUA,IAAW,GAAI,CAC3B,MAAMC,EAAQD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,KAAI,CAAE,EAC3CC,EAAWhc,EAAK,KAChBe,EAAWf,EAAK,KAAK,YAAW,EActC,GAAI,CAZgB8b,EAAM,KAAK5a,GACzBA,EAAK,WAAW,GAAG,EACdH,EAAS,SAASG,CAAI,EACpBA,EAAK,SAAS,GAAG,EACtBA,EAAK,SAAS,IAAI,EACb8a,EAAS,WAAW9a,EAAK,QAAQ,KAAM,EAAE,CAAC,EAE5C8a,IAAa9a,EAEf,EACR,EAGC,YAAK,UAAU,0BAA0BlB,EAAK,IAAI,EAAE,EAC7C,EAEf,CAEI,OAAI,KAAK,QAAU,GAAKA,EAAK,KAAO,KAAK,SACvC,KAAK,UAAU,qBAAqB,KAAK,WAAW,KAAK,OAAO,CAAC,EAAE,EAC5D,IAGF,EACX,CAEE,eAAeA,EAAM,CACnB,MAAM6F,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,sBACjBA,EAAK,QAAQ,SAAW7F,EAAK,KAE7B,MAAMic,EAAW,KAAK,YAAYjc,EAAK,IAAI,EAE3C6F,EAAK,UAAY;AAAA;AAAA,UAEXoW,CAAQ;AAAA;AAAA,8CAE4B,KAAK,iBAAiBjc,EAAK,IAAI,CAAC;AAAA,0CACpC,KAAK,WAAWA,EAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAShE,MAAMkc,EAAYrW,EAAK,cAAc,wBAAwB,EACvDsW,EAAgB,IAAM,CAC1B,KAAK,WAAWnc,EAAM6F,CAAI,CAChC,EACIqW,EAAU,iBAAiB,QAASC,CAAa,EAEjD,KAAK,WAAW,KAAK,CAAE,GAAID,EAAW,MAAO,QAAS,QAASC,CAAa,CAAE,EAEzE,KAAK,OACR,KAAK,KAAO,SAAS,cAAc,KAAK,EACxC,KAAK,KAAK,UAAY,sBACtB,KAAK,QAAQ,YAAY,KAAK,IAAI,GAGpC,KAAK,KAAK,YAAYtW,CAAI,CAC9B,CAEE,YAAY3E,EAAM,CAChB,OAAIA,EAAK,WAAW,QAAQ,EACnB,4OAELA,EAAK,WAAW,QAAQ,EACnB,6MAELA,EAAK,WAAW,QAAQ,EACnB,wOAELA,EAAK,SAAS,KAAK,GAGnBA,EAAK,SAAS,UAAU,GAAKA,EAAK,SAAS,MAAM,EAC5C,kUAELA,EAAK,SAAS,KAAK,GAAKA,EAAK,SAAS,SAAS,EAC1C,6OAEF,oNACX,CAEE,iBAAiBzH,EAAMuL,EAAY,GAAI,CACrC,GAAIvL,EAAK,QAAUuL,EAAW,OAAOvL,EACrC,MAAM2iB,EAAY3iB,EAAK,UAAUA,EAAK,YAAY,GAAG,CAAC,EAGtD,OAFuBA,EAAK,UAAU,EAAGA,EAAK,YAAY,GAAG,CAAC,EAC7B,UAAU,EAAGuL,EAAYoX,EAAU,OAAS,CAAC,EAAI,MAC/DA,CACvB,CAEE,WAAWvO,EAAO,CAChB,GAAIA,IAAU,EAAG,MAAO,MACxB,MAAMsC,EAAI,KACJkM,EAAQ,CAAC,IAAK,KAAM,KAAM,IAAI,EAC9B7b,EAAI,KAAK,MAAM,KAAK,IAAIqN,CAAK,EAAI,KAAK,IAAIsC,CAAC,CAAC,EAClD,OAAO,YAAYtC,EAAQ,KAAK,IAAIsC,EAAG3P,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAI,IAAM6b,EAAM7b,CAAC,CAC1E,CAEE,WAAWR,EAAMsc,EAAa,CAC5B,KAAK,MAAQ,KAAK,MAAM,OAAOxP,GAAKA,IAAM9M,CAAI,EAC1Csc,GACFA,EAAY,OAAM,EAEhB,KAAK,MAAM,SAAW,GAAK,KAAK,OAClC,KAAK,KAAK,SACV,KAAK,KAAO,MAEd,KAAK,eAAc,CACvB,CAEE,YAAa,CACX,KAAK,MAAQ,GACT,KAAK,OACP,KAAK,KAAK,SACV,KAAK,KAAO,MAEV,KAAK,UACP,KAAK,QAAQ,UAAY,IAE3B,KAAK,WAAU,EACf,KAAK,eAAc,CACvB,CAEE,UAAU3Q,EAAS,CACjB,KAAK,WAAU,EACf,KAAK,SAAS,UAAU,IAAI,UAAU,EAEtC,MAAM4Q,EAAe,SAAS,cAAc,KAAK,EACjDA,EAAa,UAAY,uBACzBA,EAAa,YAAc5Q,EAC3B4Q,EAAa,aAAa,OAAQ,OAAO,EACzCA,EAAa,aAAa,YAAa,QAAQ,EAC/C,KAAK,SAAS,YAAYA,CAAY,EAEtC,WAAW,IAAM,CACf,KAAK,WAAU,CACrB,EAAO,GAAI,CACX,CAEE,YAAa,CACX,KAAK,SAAS,UAAU,OAAO,UAAU,EACzC,MAAMA,EAAe,KAAK,SAAS,cAAc,uBAAuB,EACpEA,GACFA,EAAa,OAAM,CAEzB,CAEE,YAAYvc,EAAM,CAChB,GAAI,CAACA,EAAK,KAAK,WAAW,QAAQ,EAAG,OAEhC,KAAK,UACR,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,yBACzB,KAAK,QAAQ,aAAa,KAAK,QAAS,KAAK,MAAQ,IAAI,GAG3D,MAAMwc,EAAS,IAAI,WACnBA,EAAO,OAAUviB,GAAM,CACrB,MAAMwiB,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,8BACxBA,EAAY,UAAY;AAAA,oBACVxiB,EAAE,OAAO,MAAM,UAAU+F,EAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAShD,MAAM0c,EAAmBD,EAAY,cAAc,gCAAgC,EAC7EE,EAAuB,IAAM,CACjC,KAAK,WAAW3c,EAAM,KAAK,MAAM,cAAc,mBAAmBA,EAAK,IAAI,IAAI,CAAC,EAChFyc,EAAY,OAAM,EACd,KAAK,SAAW,KAAK,QAAQ,SAAS,SAAW,IACnD,KAAK,QAAQ,SACb,KAAK,QAAU,KAEzB,EACMC,EAAiB,iBAAiB,QAASC,CAAoB,EAC/D,KAAK,WAAW,KAAK,CAAE,GAAID,EAAkB,MAAO,QAAS,QAASC,CAAoB,CAAE,EAE5F,KAAK,QAAQ,YAAYF,CAAW,CAC1C,EACID,EAAO,cAAcxc,CAAI,CAC7B,CAEE,eAAe4c,EAAS,CACjB,KAAK,WACR,KAAK,SAAW,SAAS,cAAc,KAAK,EAC5C,KAAK,SAAS,UAAY,0BAC1B,KAAK,QAAQ,aAAa,KAAK,SAAU,KAAK,MAAQ,IAAI,GAG5D,KAAK,SAAS,MAAM,QAAU,QAE9B,MAAMC,EAAM,KAAK,SAAS,cAAc,8BAA8B,GAAK,SAAS,cAAc,KAAK,EACvGA,EAAI,UAAY,8BAChBA,EAAI,MAAM,MAAQ,GAAGD,CAAO,IAEvB,KAAK,SAAS,cAAc,8BAA8B,GAC7D,KAAK,SAAS,YAAYC,CAAG,EAG3BD,GAAW,KACb,WAAW,IAAM,CACX,KAAK,WACP,KAAK,SAAS,SACd,KAAK,SAAW,KAE1B,EAAS,GAAG,CAEZ,CAEE,eAAe5c,EAAM,CACnB,KAAK,eAAe,CAAC,EACrB,MAAMI,EAAc,IACpB,IAAI0c,EAAe,EACD,KAAK,IAAI,EAAG,KAAK,MAAM9c,EAAK,KAAOI,CAAW,CAAC,EAEjE,MAAM2c,EAAiB,YAAY,IAAM,CACvCD,IACA,MAAMF,EAAU,KAAK,IAAI,IAAK,KAAK,MAAOE,EAAe1c,EAAe,GAAG,CAAC,EAC5E,KAAK,eAAewc,CAAO,EAEvBE,GAAgB1c,IAClB,cAAc2c,CAAc,EAC5B,KAAK,eAAe,GAAG,EAE/B,EAAO,KAAK,IAAI,GAAI,KAAK,MAAM,IAAO3c,CAAW,CAAC,CAAC,EAE/C,OAAO2c,CACX,CAEE,UAAW,CACT,MAAO,CAAC,GAAG,KAAK,KAAK,CACzB,CAEE,gBAAiB,CACf,KAAK,QAAQ,cAAc,IAAI,YAAY,uBAAwB,CACjE,OAAQ,CACN,MAAO,KAAK,SAAQ,EACpB,MAAO,KAAK,MAAM,QAErB,CAAC,CACN,CAEE,SAAU,CACR,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAArE,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAClD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CAC3C,CAAK,EACD,KAAK,WAAa,KAClB,KAAK,MAAQ,GACb,KAAK,SAAW,KAChB,KAAK,MAAQ,KACb,KAAK,KAAO,KACZ,KAAK,SAAW,KAChB,KAAK,QAAU,KACf,KAAK,QAAU,IACnB,EAGA,SAASgjB,EAAe1jB,EAAS,CAC/B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM2C,EAAW,IAAIqf,EAAWhiB,CAAO,EACvCA,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAChC,CAEA,SAAS2jB,EAAkB3jB,EAAS,CAClC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEA,SAAS4jB,GAAkB,CACzB,SAAS,iBAAiB,gBAAgB,EAAE,QAAQxE,GAAM,CACxDsE,EAAetE,CAAE,CACrB,CAAG,CACH,CAEqCrd,EAAO,QAC1CA,EAAA,QAAiB,CAAE,WAAAigB,EAAY,gBAAA4B,EAAiB,eAAAF,EAAgB,kBAAAC,IAEhE,OAAO,WAAa3B,EACpB,OAAO,eAAiB0B,EACxB,OAAO,kBAAoBC,GAGzB,OAAO,mBACT,OAAO,kBAAkB,SAAS,aAAcD,EAAgBC,CAAiB,uFCtYnF,MAAME,CAAS,CACX,YAAY7jB,EAAS,CACjB,KAAK,QAAUA,EACf,KAAK,QAAU,GACf,KAAK,WAAa,GAClB,KAAK,MAAK,CAClB,CAEI,OAAQ,CACY,KAAK,QAAQ,iBAAiB,sBAAsB,EAE5D,QAAQ8jB,GAAU,CACtB,MAAMvX,EAAOuX,EAAO,QAAQ,oBAAoB,EAC1CnD,EAAUmD,EAAO,mBAEvB,GAAI,CAACvX,GAAQ,CAACoU,GAAW,CAACA,EAAQ,UAAU,SAAS,sBAAsB,EAAG,OAE9E,MAAMoD,EAAWxX,EAAK,UAAU,SAAS,WAAW,EACpDoU,EAAQ,MAAM,OAASoD,EAAWpD,EAAQ,aAAe,KAAO,IAEhE,MAAMsB,EAAe,IAAM,CAGvB,GAFmBtB,EAAQ,MAAM,SAAW,MAGxCA,EAAQ,MAAM,OAAS,IACvBpU,EAAK,UAAU,OAAO,WAAW,MAC9B,CACHoU,EAAQ,MAAM,OAASA,EAAQ,aAAe,KAC9CpU,EAAK,UAAU,IAAI,WAAW,EAE9B,MAAMyX,EAAoB,UAA2B,CACjDrD,EAAQ,oBAAoB,gBAAiBqD,CAAiB,EAC9DrD,EAAQ,MAAM,OAAS,EAC/C,EACoBA,EAAQ,iBAAiB,gBAAiBqD,CAAiB,EAC3D,KAAK,WAAW,KAAK,CAAE,GAAIrD,EAAS,MAAO,gBAAiB,QAASqD,CAAiB,CAAE,CAC5G,CACA,EAEYF,EAAO,iBAAiB,QAAS7B,CAAY,EAC7C,KAAK,QAAQ,KAAK,CAAE,OAAA6B,EAAQ,KAAAvX,EAAM,QAAAoU,EAAS,aAAAsB,CAAY,CAAE,EACzD,KAAK,WAAW,KAAK,CAAE,GAAI6B,EAAQ,MAAO,QAAS,QAAS7B,CAAY,CAAE,CACtF,CAAS,CACT,CAEI,SAAU,CACN,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAA7C,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAChD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACjD,CAAS,EACD,KAAK,WAAa,KAClB,KAAK,QAAU,KACf,KAAK,QAAU,IACvB,CAEI,OAAOoD,EAAO,CACV,MAAMmgB,EAAa,KAAK,QAAQngB,CAAK,EACjCmgB,GACAA,EAAW,aAAY,CAEnC,CAEI,OAAOngB,EAAO,CACV,MAAMmgB,EAAa,KAAK,QAAQngB,CAAK,EACjCmgB,GAAc,CAACA,EAAW,KAAK,UAAU,SAAS,WAAW,GAC7DA,EAAW,aAAY,CAEnC,CAEI,SAASngB,EAAO,CACZ,MAAMmgB,EAAa,KAAK,QAAQngB,CAAK,EACjCmgB,GAAcA,EAAW,KAAK,UAAU,SAAS,WAAW,GAC5DA,EAAW,aAAY,CAEnC,CAEI,WAAY,CACR,KAAK,QAAQ,QAAQ,CAACA,EAAYngB,IAAU,CACnCmgB,EAAW,KAAK,UAAU,SAAS,WAAW,GAC/C,KAAK,OAAOngB,CAAK,CAEjC,CAAS,CACT,CAEI,aAAc,CACV,KAAK,QAAQ,QAAQ,CAACmgB,EAAYngB,IAAU,CACpCmgB,EAAW,KAAK,UAAU,SAAS,WAAW,GAC9C,KAAK,OAAOngB,CAAK,CAEjC,CAAS,CACT,EAGA,SAASogB,EAAalkB,EAAS,CAC3B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAMmkB,EAAW,IAAIN,EAAS7jB,CAAO,EACrCA,EAAQ,iBAAmBmkB,EAC3BnkB,EAAQ,oBAAsB,EAClC,CAEA,SAASokB,EAAgBpkB,EAAS,CAC9B,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAEA,SAASqkB,GAAgB,CACrB,SAAS,iBAAiB,cAAc,EAAE,QAAQF,GAAY,CAC1DD,EAAaC,CAAQ,CAC7B,CAAK,CACL,CAEqCpiB,EAAO,QACxCA,EAAA,QAAiB,CAAE,SAAA8hB,EAAU,cAAAQ,EAAe,aAAAH,EAAc,gBAAAE,IAE1D,OAAO,SAAWP,EAClB,OAAO,aAAeK,EACtB,OAAO,gBAAkBE,GAGzB,OAAO,mBACP,OAAO,kBAAkB,SAAS,WAAYF,EAAcE,CAAe,sBC7H/E,MAAME,EAAY,CAChB,YAAYtkB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,QAAUA,EAAQ,cAAc,2BAA2B,EAChE,KAAK,MAAQA,EAAQ,cAAc,yBAAyB,EAC5D,KAAK,UAAYA,EAAQ,cAAc,yBAAyB,EAChE,KAAK,YAAcA,EAAQ,cAAc,yBAAyB,EAClE,KAAK,MAAQ,eAAe,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAEnE,KAAK,qBAAuB,KAC5B,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,mBAAqB,KAC1B,KAAK,mBAAqB,IAC5B,CAEA,MAAO,CACD,CAAC,KAAK,SAAW,CAAC,KAAK,OACvB,KAAK,QAAQ,sBAEjB,KAAK,qBAAwBW,GAAM,CACjCA,EAAE,gBAAe,EACjB,KAAK,YAAW,CAClB,EAEA,KAAK,mBAAsBA,GAAM,CAE/B,MAAM4jB,EADW5jB,EAAE,cACI,aAAa,YAAY,EAChD,KAAK,YAAY4jB,CAAK,EACtB,KAAK,UAAS,CAChB,EAEA,KAAK,mBAAsB5jB,GAAM,CAC/B,KAAK,YAAYA,EAAE,OAAO,KAAK,CACjC,EAEA,KAAK,sBAAyBA,GAAM,CAC7B,KAAK,QAAQ,SAASA,EAAE,MAAM,GACjC,KAAK,UAAS,CAElB,EAEA,KAAK,QAAQ,iBAAiB,QAAS,KAAK,oBAAoB,EAEhE,KAAK,MAAM,iBAAiB,yBAAyB,EAAE,QAAQ6jB,GAAY,CACzEA,EAAS,iBAAiB,QAAS,KAAK,kBAAkB,EAC1DA,EAAS,yBAA2B,KAAK,kBAC3C,CAAC,EAEG,KAAK,cACP,KAAK,YAAY,iBAAiB,QAAS,KAAK,kBAAkB,EAClE,KAAK,YAAY,yBAA2B,KAAK,oBAG/C,OAAO,aACT,KAAK,uBAAyB,OAAO,aAAa,GAAG,SAAU,QAAS,KAAK,sBAAuB,CAAE,MAAO,KAAK,KAAK,CAAE,EAEzH,SAAS,iBAAiB,QAAS,KAAK,qBAAqB,EAG/D,KAAK,QAAQ,oBAAsB,GACrC,CAEA,aAAc,CACZ,KAAK,MAAM,UAAU,OAAO,YAAY,CAC1C,CAEA,WAAY,CACV,KAAK,MAAM,UAAU,OAAO,YAAY,CAC1C,CAEA,YAAYD,EAAO,CACjB,KAAK,QAAQ,MAAM,gBAAkBA,EACjC,KAAK,YACP,KAAK,UAAU,YAAcA,EAAM,YAAW,GAE5C,KAAK,cACP,KAAK,YAAY,MAAQA,GAE3B,KAAK,QAAQ,cAAc,IAAI,YAAY,cAAe,CAAE,OAAQ,CAAE,MAAAA,EAAO,CAAE,CAAC,CAClF,CAEA,SAAU,CACH,KAAK,QAAQ,sBAEd,KAAK,SAAW,KAAK,sBACvB,KAAK,QAAQ,oBAAoB,QAAS,KAAK,oBAAoB,EAGjE,KAAK,OACP,KAAK,MAAM,iBAAiB,yBAAyB,EAAE,QAAQC,GAAY,CACrEA,EAAS,0BACXA,EAAS,oBAAoB,QAASA,EAAS,wBAAwB,CAE3E,CAAC,EAGC,KAAK,aAAe,KAAK,oBAC3B,KAAK,YAAY,oBAAoB,QAAS,KAAK,kBAAkB,EAGnE,KAAK,wBAA0B,KAAK,uBAAuB,YAC7D,KAAK,uBAAuB,cACnB,KAAK,uBACd,SAAS,oBAAoB,QAAS,KAAK,qBAAqB,EAGlE,KAAK,sBAAwB,KAC7B,KAAK,uBAAyB,KAC9B,KAAK,qBAAuB,KAC5B,KAAK,mBAAqB,KAC1B,KAAK,mBAAqB,KAC1B,KAAK,QAAQ,oBAAsB,GACrC,CACF,CAEA,SAASC,GAAgBzkB,EAAS,CAChC,MAAMme,EAAS,IAAImG,GAAYtkB,CAAO,EACtCme,EAAO,KAAI,EACXne,EAAQ,mBAAqBme,CAC/B,CAQA,SAASuG,GAAmBvG,EAAQ,CAC9BA,EAAO,qBACTA,EAAO,mBAAmB,UAC1BA,EAAO,mBAAqB,KAEhC,CAQI,OAAO,mBACT,OAAO,kBAAkB,SAAS,eAAgBsG,GAAiBC,EAAkB,mEC9IvF,MAAMC,CAAS,CACX,YAAY3kB,EAAS,CASjB,GARA,KAAK,QAAUA,EACf,KAAK,QAAUA,EAAQ,cAAc,qBAAqB,EAC1D,KAAK,OAASA,EAAQ,cAAc,oBAAoB,EACxD,KAAK,QAAUA,EAAQ,cAAc,yBAAyB,EAC9D,KAAK,QAAUA,EAAQ,cAAc,yBAAyB,EAC9D,KAAK,SAAWA,EAAQ,cAAc,0BAA0B,EAChE,KAAK,WAAa,GAEd,CAAC,KAAK,SAAW,CAAC,KAAK,OACvB,MAAM,IAAI,MAAM,qCAAqC,EAGzD,KAAK,YAAc,IAAI,KACvB,KAAK,MAAK,CAClB,CAEI,OAAQ,CACJ,KAAK,OAAM,EAEX,MAAM4kB,EAAc,IAAM,CACtB,KAAK,YAAY,SAAS,KAAK,YAAY,SAAQ,EAAK,CAAC,EACzD,KAAK,OAAM,CACvB,EAEcC,EAAc,IAAM,CACtB,KAAK,YAAY,SAAS,KAAK,YAAY,SAAQ,EAAK,CAAC,EACzD,KAAK,OAAM,CACvB,EAEcC,EAAe,IAAM,CACvB,KAAK,YAAc,IAAI,KACvB,KAAK,OAAM,CACvB,EAEY,KAAK,UACL,KAAK,QAAQ,iBAAiB,QAASF,CAAW,EAClD,KAAK,WAAW,KAAK,CAAE,GAAI,KAAK,QAAS,MAAO,QAAS,QAASA,CAAW,CAAE,GAG/E,KAAK,UACL,KAAK,QAAQ,iBAAiB,QAASC,CAAW,EAClD,KAAK,WAAW,KAAK,CAAE,GAAI,KAAK,QAAS,MAAO,QAAS,QAASA,CAAW,CAAE,GAG/E,KAAK,WACL,KAAK,SAAS,iBAAiB,QAASC,CAAY,EACpD,KAAK,WAAW,KAAK,CAAE,GAAI,KAAK,SAAU,MAAO,QAAS,QAASA,CAAY,CAAE,EAE7F,CAEI,QAAS,CACL,MAAM5V,EAAO,KAAK,YAAY,YAAW,EACnCC,EAAQ,KAAK,YAAY,SAAQ,EAEvC,KAAK,QAAQ,YAAc,GAAGD,CAAI,IAAI,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAAEC,CAAK,CAAC,GAEjI,MAAMsO,EAAW,IAAI,KAAKvO,EAAMC,EAAO,CAAC,EAAE,SACpCuO,EAAc,IAAI,KAAKxO,EAAMC,EAAQ,EAAG,CAAC,EAAE,UAEjD,KAAK,OAAO,UAAY,GAExB,QAASjI,EAAI,EAAGA,EAAIuW,EAAUvW,IAAK,CAC/B,MAAMyW,EAAW,SAAS,cAAc,MAAM,EAC9CA,EAAS,UAAY,2CACrB,KAAK,OAAO,YAAYA,CAAQ,CAC5C,CAEQ,MAAME,EAAQ,IAAI,KACZC,EAAW,GAAGD,EAAM,YAAW,CAAE,IAAI,OAAOA,EAAM,SAAQ,EAAK,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOA,EAAM,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,GAEpI,QAASzO,EAAM,EAAGA,GAAOsO,EAAatO,IAAO,CACzC,MAAMoO,EAAQ,SAAS,cAAc,QAAQ,EAC7CA,EAAM,UAAY,mBAClBA,EAAM,YAAcpO,EAEpB,MAAM2V,EAAS,GAAG7V,CAAI,IAAI,OAAOC,EAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,IAAI,OAAOC,CAAG,EAAE,SAAS,EAAG,GAAG,CAAC,GAExF2V,IAAWjH,GACXN,EAAM,UAAU,IAAI,UAAU,EAGlC,MAAMyE,EAAe,IAAM,CACvB,KAAK,QAAQ,iBAAiB,mBAAmB,EAAE,QAAQ/O,GAAKA,EAAE,UAAU,OAAO,aAAa,CAAC,EACjGsK,EAAM,UAAU,IAAI,aAAa,EACjC,KAAK,MAAM,SAAU,CAAE,KAAM,IAAI,KAAKtO,EAAMC,EAAOC,CAAG,EAAG,QAAS2V,CAAM,CAAE,CAC1F,EAEYvH,EAAM,iBAAiB,QAASyE,CAAY,EAC5C,KAAK,WAAW,KAAK,CAAE,GAAIzE,EAAO,MAAO,QAAS,QAASyE,CAAY,CAAE,EAEzE,KAAK,OAAO,YAAYzE,CAAK,CACzC,CACA,CAEI,SAAU,CACN,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAA4B,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAChD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACjD,CAAS,EACD,KAAK,WAAa,KAClB,KAAK,QAAU,KACf,KAAK,OAAS,KACd,KAAK,QAAU,KACf,KAAK,QAAU,KACf,KAAK,SAAW,KAChB,KAAK,QAAU,IACvB,CAEI,QAAQsO,EAAM,CACV,KAAK,YAAc,IAAI,KAAKA,CAAI,EAChC,KAAK,OAAM,CACnB,CAEI,SAAU,CACN,OAAO,KAAK,WACpB,CAEI,WAAY,CACR,KAAK,YAAY,SAAS,KAAK,YAAY,SAAQ,EAAK,CAAC,EACzD,KAAK,OAAM,CACnB,CAEI,WAAY,CACR,KAAK,YAAY,SAAS,KAAK,YAAY,SAAQ,EAAK,CAAC,EACzD,KAAK,OAAM,CACnB,CAEI,WAAY,CACR,KAAK,YAAc,IAAI,KACvB,KAAK,OAAM,CACnB,CAEI,MAAMxO,EAAWC,EAAM,CACnB,GAAI,KAAK,QAAS,CACd,MAAMG,EAAc,IAAI,YAAY,mBAAmBJ,CAAS,GAAI,CAChE,OAAQC,EACR,QAAS,GACT,WAAY,EAC5B,CAAa,EACD,KAAK,QAAQ,cAAcG,CAAW,CAClD,CACA,EAGA,SAASokB,EAAahlB,EAAS,CAC3B,GAAI,CAAAA,EAAQ,oBAEZ,GAAI,CACA,MAAMgd,EAAW,IAAI2H,EAAS3kB,CAAO,EACrCA,EAAQ,iBAAmBgd,EAC3Bhd,EAAQ,oBAAsB,EACtC,OAAae,EAAO,CACZ,QAAQ,MAAM,iCAAkCA,CAAK,CAC7D,CACA,CAEA,SAASkkB,EAAgBjlB,EAAS,CAC9B,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAEA,SAASklB,GAAgB,CACrB,SAAS,iBAAiB,cAAc,EAAE,QAAQlI,GAAY,CAC1DgI,EAAahI,CAAQ,CAC7B,CAAK,CACL,CAEqCjb,EAAO,QACxCA,EAAA,QAAiB,CAAE,SAAA4iB,EAAU,cAAAO,EAAe,aAAAF,EAAc,gBAAAC,IAE1D,OAAO,SAAWN,EAClB,OAAO,aAAeK,EACtB,OAAO,gBAAkBC,GAGzB,OAAO,mBACP,OAAO,kBAAkB,SAAS,WAAYD,EAAcC,CAAe,uFCtL/E,MAAME,CAAY,CACd,YAAYnlB,EAAS,CACjB,KAAK,QAAUA,EACf,KAAK,MAAQA,EAAQ,cAAc,yBAAyB,EAC5D,KAAK,WAAa,GAClB,KAAK,KAAI,CACjB,CAEI,MAAO,CACH,KAAK,WAAU,CACvB,CAEI,YAAa,CAcT,GAbA,KAAK,QAAQ,iBAAiB,0BAA0B,EAAE,QAAQ4iB,GAAa,CAC3E,MAAMC,EAAiBliB,GAAM,CACzBA,EAAE,gBAAe,EACjB,MAAMykB,EAAMxC,EAAU,QAAQ,uBAAuB,EACjDwC,IACAA,EAAI,OAAM,EACV,KAAK,eAAc,EAEvC,EACYxC,EAAU,iBAAiB,QAASC,CAAa,EACjD,KAAK,WAAW,KAAK,CAAE,GAAID,EAAW,MAAO,QAAS,QAASC,CAAa,CAAE,CAC1F,CAAS,EAEG,KAAK,MAAO,CACZ,MAAMwC,EAAS,IAAM,CACjB,MAAMjlB,EAAQ,KAAK,MAAM,MAAM,KAAI,EACnC,GAAI,CAACA,EAAO,OAEZ,MAAMglB,EAAM,SAAS,cAAc,MAAM,EACzCA,EAAI,UAAY,uBAChB,MAAME,EAAW,SAAS,eAAellB,CAAK,EAC9CglB,EAAI,YAAYE,CAAQ,EACxB,MAAM1C,EAAY,SAAS,cAAc,QAAQ,EACjDA,EAAU,UAAY,0BACtBA,EAAU,UAAY,sLACtBwC,EAAI,YAAYxC,CAAS,EAEzB,MAAM2C,EAAoB5kB,GAAM,CAC5BA,EAAE,gBAAe,EACjBykB,EAAI,OAAM,EACV,KAAK,eAAc,CACvC,EACgBxC,EAAU,iBAAiB,QAAS2C,CAAgB,EACpD,KAAK,WAAW,KAAK,CAAE,GAAI3C,EAAW,MAAO,QAAS,QAAS2C,CAAgB,CAAE,EAEjF,KAAK,QAAQ,aAAaH,EAAK,KAAK,KAAK,EACzC,KAAK,MAAM,MAAQ,GACnB,KAAK,MAAM,QACX,KAAK,eAAc,CACnC,EAEkBzD,EAAkBhhB,GAAM,CACtBA,EAAE,MAAQ,UACVA,EAAE,eAAc,EAChBA,EAAE,gBAAe,EACjB0kB,IAEpB,EACY,KAAK,MAAM,iBAAiB,UAAW1D,CAAc,EACrD,KAAK,WAAW,KAAK,CAAE,GAAI,KAAK,MAAO,MAAO,UAAW,QAASA,CAAc,CAAE,EAElF,MAAMM,EAAe,IAAM,CACvB,KAAK,MAAM,OAC3B,EACY,KAAK,QAAQ,iBAAiB,QAASA,CAAY,EACnD,KAAK,WAAW,KAAK,CAAE,GAAI,KAAK,QAAS,MAAO,QAAS,QAASA,CAAY,CAAE,CAC5F,CACA,CAEI,OAAO7hB,EAAO,CACN,CAACA,GAAS,CAAC,KAAK,QACpB,KAAK,MAAM,MAAQA,EACnB,KAAK,MAAM,cAAc,IAAI,cAAc,UAAW,CAAE,IAAK,OAAO,CAAE,CAAC,EAC/E,CAEI,UAAU0D,EAAO,CAEb,MAAMshB,EADO,KAAK,QAAQ,iBAAiB,uBAAuB,EACjDthB,CAAK,EAClBshB,IACAA,EAAI,OAAM,EACV,KAAK,eAAc,EAE/B,CAEI,SAAU,CACN,MAAMI,EAAO,CAAA,EACb,YAAK,QAAQ,iBAAiB,uBAAuB,EAAE,QAAQJ,GAAO,CAClEI,EAAK,KAAKJ,EAAI,WAAW,CACrC,CAAS,EACMI,CACf,CAEI,WAAY,CACR,KAAK,QAAQ,iBAAiB,uBAAuB,EAAE,QAAQJ,GAAO,CAClEA,EAAI,OAAM,CACtB,CAAS,EACD,KAAK,eAAc,CAC3B,CAEI,gBAAiB,CACb,KAAK,QAAQ,cAAc,IAAI,YAAY,yBAA0B,CACjE,OAAQ,CACJ,KAAM,KAAK,QAAO,EAClB,MAAO,KAAK,QAAO,EAAG,QAE7B,CAAC,CACV,CAEI,SAAU,CACN,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAAhG,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAChD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACjD,CAAS,EACD,KAAK,WAAa,KAClB,KAAK,MAAQ,KACb,KAAK,QAAU,IACvB,EAGA,SAAS+kB,EAAgBzlB,EAAS,CAC9B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM2C,EAAW,IAAIwiB,EAAYnlB,CAAO,EACxCA,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAClC,CAEA,SAAS0lB,EAAmB1lB,EAAS,CACjC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAEA,SAAS2lB,GAAqB,CAC1B,SAAS,iBAAiB,kBAAkB,EAAE,QAAQH,GAAQ,CAC1DC,EAAgBD,CAAI,CAC5B,CAAK,CACL,CAEqCzjB,EAAO,QACxCA,EAAA,QAAiB,CAAE,YAAAojB,EAAa,mBAAAQ,EAAoB,gBAAAF,EAAiB,mBAAAC,IAErE,OAAO,YAAcP,EACrB,OAAO,gBAAkBM,EACzB,OAAO,mBAAqBC,GAG5B,OAAO,mBACP,OAAO,kBAAkB,SAAS,eAAgBD,EAAiBC,CAAkB,wFC1JzF,MAAME,CAAa,CACjB,YAAY1iB,EAAU,GAAI,CACxB,KAAK,OAASA,EAAQ,QAAU,CAAA,EAChC,KAAK,aAAeA,EAAQ,cAAgB,EAC5C,KAAK,QAAU,KACf,KAAK,aAAe,KAAK,MAAM,KAAK,IAAI,EACxC,KAAK,WAAa,KAAK,cAAc,KAAK,IAAI,EAC9C,KAAK,aAAe,KAAK,mBAAmB,KAAK,IAAI,EAErD,KAAK,KAAI,CACb,CAEE,MAAO,CACL,KAAK,cAAa,CACtB,CAEE,eAAgB,CACd,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,2BACzB,KAAK,QAAQ,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6BzB,SAAS,KAAK,YAAY,KAAK,OAAO,EAEtC,KAAK,WAAU,CACnB,CAEE,YAAa,CACX,MAAMgd,EAAW,KAAK,QAAQ,cAAc,0BAA0B,EAChE9C,EAAU,KAAK,QAAQ,cAAc,kCAAkC,EACvEC,EAAU,KAAK,QAAQ,cAAc,kCAAkC,EAE7E,KAAK,aAAe,IAAM,KAAK,KAAI,EACnC,KAAK,aAAe,IAAM,KAAK,KAAI,EAEnC6C,EAAS,iBAAiB,QAAS,KAAK,YAAY,EACpD9C,EAAQ,iBAAiB,QAAS,KAAK,YAAY,EACnDC,EAAQ,iBAAiB,QAAS,KAAK,YAAY,CACvD,CAEE,cAAc1c,EAAG,CACf,GAAK,KAAK,QAAQ,UAAU,SAAS,YAAY,EAEjD,OAAQA,EAAE,IAAG,CACX,IAAK,SACH,KAAK,MAAK,EACV,MACF,IAAK,YACH,KAAK,KAAI,EACT,MACF,IAAK,aACH,KAAK,KAAI,EACT,MAER,CAEE,mBAAmBA,EAAG,CAChBA,EAAE,SAAW,KAAK,SACpB,KAAK,MAAK,CAEhB,CAEE,KAAKklB,EAAQ/hB,EAAQ,EAAG,CACtB,KAAK,OAAS+hB,EACd,KAAK,aAAe,KAAK,IAAI,KAAK,IAAI/hB,EAAO,CAAC,EAAG+hB,EAAO,OAAS,CAAC,EAElE,KAAK,OAAM,EACX,KAAK,QAAQ,UAAU,IAAI,YAAY,EAEvC,SAAS,iBAAiB,UAAW,KAAK,UAAU,EACpD,KAAK,QAAQ,iBAAiB,QAAS,KAAK,YAAY,EACxD,SAAS,KAAK,MAAM,SAAW,QACnC,CAEE,OAAQ,CACN,KAAK,QAAQ,UAAU,OAAO,YAAY,EAE1C,SAAS,oBAAoB,UAAW,KAAK,UAAU,EACvD,KAAK,QAAQ,oBAAoB,QAAS,KAAK,YAAY,EAC3D,SAAS,KAAK,MAAM,SAAW,EACnC,CAEE,MAAO,CACD,KAAK,aAAe,IACtB,KAAK,eACL,KAAK,OAAM,EAEjB,CAEE,MAAO,CACD,KAAK,aAAe,KAAK,OAAO,OAAS,IAC3C,KAAK,eACL,KAAK,OAAM,EAEjB,CAEE,KAAK/hB,EAAO,CACNA,GAAS,GAAKA,EAAQ,KAAK,OAAO,SACpC,KAAK,aAAeA,EACpB,KAAK,OAAM,EAEjB,CAEE,QAAS,CACP,MAAMkR,EAAM,KAAK,QAAQ,cAAc,gCAAgC,EACjE0L,EAAQ,KAAK,QAAQ,cAAc,0BAA0B,EAC7DoF,EAAO,KAAK,QAAQ,cAAc,yBAAyB,EAC3DC,EAAa,KAAK,QAAQ,cAAc,+BAA+B,EACvE3I,EAAU,KAAK,QAAQ,cAAc,kCAAkC,EACvEC,EAAU,KAAK,QAAQ,cAAc,kCAAkC,EAEvE2I,EAAe,KAAK,OAAO,KAAK,YAAY,EAElDhR,EAAI,IAAMgR,EAAa,IACvBhR,EAAI,IAAMgR,EAAa,KAAO,GAC9BtF,EAAM,YAAcsF,EAAa,OAAS,GAC1CF,EAAK,YAAcE,EAAa,MAAQ,GAAG,KAAK,aAAe,CAAC,MAAM,KAAK,OAAO,MAAM,GAExF5I,EAAQ,SAAW,KAAK,eAAiB,EACzCC,EAAQ,SAAW,KAAK,eAAiB,KAAK,OAAO,OAAS,EAE9D0I,EAAW,UAAY,KAAK,OAAO,IAAI,CAAC5f,EAAGe,IAAM;AAAA,kDACHA,IAAM,KAAK,aAAe,aAAe,EAAE,+BAA+BA,CAAC,6BAA6BA,EAAI,CAAC;AAAA,KAC1J,EAAE,KAAK,EAAE,EAEV6e,EAAW,iBAAiB,8BAA8B,EAAE,QAAQrG,GAAa,CAC/E,MAAMuC,EAAe,IAAM,CACzB,KAAK,KAAK,SAASvC,EAAU,QAAQ,KAAK,CAAC,CACnD,EACMA,EAAU,iBAAiB,QAASuC,CAAY,EAChDvC,EAAU,cAAgBuC,CAChC,CAAK,CACL,CAEE,SAAU,CACR,KAAK,MAAK,EAEV,MAAM8D,EAAa,KAAK,SAAS,cAAc,+BAA+B,EAC1EA,GACFA,EAAW,iBAAiB,8BAA8B,EAAE,QAAQrG,GAAa,CAC3EA,EAAU,eACZA,EAAU,oBAAoB,QAASA,EAAU,aAAa,CAExE,CAAO,EAGH,MAAMQ,EAAW,KAAK,SAAS,cAAc,0BAA0B,EACjE9C,EAAU,KAAK,SAAS,cAAc,kCAAkC,EACxEC,EAAU,KAAK,SAAS,cAAc,kCAAkC,EAE1E6C,GACFA,EAAS,oBAAoB,QAAS,KAAK,YAAY,EAErD9C,GAAW,KAAK,cAClBA,EAAQ,oBAAoB,QAAS,KAAK,YAAY,EAEpDC,GAAW,KAAK,cAClBA,EAAQ,oBAAoB,QAAS,KAAK,YAAY,EAGpD,KAAK,SAAW,KAAK,QAAQ,YAC/B,KAAK,QAAQ,WAAW,YAAY,KAAK,OAAO,CAEtD,EAGA,IAAI4I,EAAuB,KAE3B,SAASC,GAAmB,CACrBD,IACHA,EAAuB,IAAIL,GAG7B,SAAS,iBAAiB,sBAAsB,EAAE,QAAQO,GAAW,CACnEA,EAAQ,iBAAiB,QAAS,IAAM,CACtC,MAAMN,EAAS,KAAK,MAAMM,EAAQ,aAAa,oBAAoB,CAAC,EAC9DriB,EAAQ,SAASqiB,EAAQ,aAAa,kBAAkB,CAAC,GAAK,EACpEF,EAAqB,KAAKJ,EAAQ/hB,CAAK,CAC7C,CAAK,CACL,CAAG,CACH,CAEA,SAASsiB,EAAiBP,EAAQ/hB,EAAQ,EAAG,CACtCmiB,IACHA,EAAuB,IAAIL,GAE7BK,EAAqB,KAAKJ,EAAQ/hB,CAAK,CACzC,CAEqC/B,EAAO,UAC1CA,EAAA,QAAiB,CAAE,aAAA6jB,EAAc,iBAAAM,EAAkB,iBAAAE,CAAgB,2FCxNrE,MAAMC,CAAI,CACN,YAAYrmB,EAAS,CACjB,KAAK,QAAUA,EACf,KAAK,SAAWA,EAAQ,cAAc,gBAAgB,EACtD,KAAK,WAAa,GAClB,KAAK,KAAI,CACjB,CAEI,MAAO,CACH,GAAI,KAAK,SAAU,CACf,MAAMsmB,EAAgB3lB,GAAM,CACxBA,EAAE,gBAAe,EACjB,KAAK,QAAQ,cAAc,IAAI,YAAY,gBAAiB,CACxD,OAAQ,CAAE,IAAK,KAAK,OAAO,EAC3B,QAAS,GACZ,CAAC,EACF,KAAK,QAAQ,QAC7B,EACY,KAAK,SAAS,iBAAiB,QAAS2lB,CAAY,EACpD,KAAK,WAAW,KAAK,CAAE,GAAI,KAAK,SAAU,MAAO,QAAS,QAASA,CAAY,CAAE,CAC7F,CACA,CAEI,WAAW3F,EAAS,CAChB,MAAM4F,EAAY,CAAA,EAClB,KAAK,QAAQ,WAAW,QAAQzjB,GAAQ,CAChCA,EAAK,WAAa,KAAK,WACvByjB,EAAU,KAAKzjB,CAAI,CAEnC,CAAS,EACDyjB,EAAU,QAAQzjB,GAAQA,EAAK,OAAM,CAAE,EACvC,KAAK,QAAQ,aAAa,SAAS,eAAe6d,CAAO,EAAG,KAAK,UAAY,IAAI,CACzF,CAEI,YAAa,CACT,OAAO,KAAK,QAAQ,YAAY,KAAI,CAC5C,CAEI,SAAU,CACN,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAAvB,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAChD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACjD,CAAS,EACD,KAAK,WAAa,KAClB,KAAK,SAAW,KAChB,KAAK,QAAU,IACvB,EAGA,SAAS8lB,EAAQxmB,EAAS,CACtB,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM2C,EAAW,IAAI0jB,EAAIrmB,CAAO,EAChCA,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAClC,CAEA,SAASymB,EAAWzmB,EAAS,CACzB,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAEA,SAAS0mB,GAAW,CAChB,SAAS,iBAAiB,SAAS,EAAE,QAAQtB,GAAO,CAChDoB,EAAQpB,CAAG,CACnB,CAAK,CACL,CAEqCrjB,EAAO,QACxCA,EAAA,QAAiB,CAAE,IAAAskB,EAAK,SAAAK,EAAU,QAAAF,EAAS,WAAAC,IAE3C,OAAO,IAAMJ,EACb,OAAO,QAAUG,EACjB,OAAO,WAAaC,GAGpB,OAAO,mBACP,OAAO,kBAAkB,SAAS,MAAOD,EAASC,CAAU,0FCjFhE,MAAME,CAAS,CACb,YAAY3mB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,aAAeA,EAAQ,cAAc,qBAAqB,EAC/D,KAAK,aAAeA,EAAQ,cAAc,6BAA6B,EACvE,KAAK,SAAW,GAChB,KAAK,UAAY,KAEjB,KAAK,KAAI,CACb,CAEE,MAAO,CACL,KAAK,aAAY,EACjB,KAAK,gBAAe,EAEpB,KAAK,UAAY,IAAI,qBAAsB4mB,GAAY,CACrDA,EAAQ,QAAQC,GAAS,CACnBA,EAAM,gBAAkB,CAAC,KAAK,WAChC,KAAK,aAAY,EACjB,KAAK,gBAAe,EACpB,KAAK,SAAW,GAE1B,CAAO,CACP,EAAO,CAAE,UAAW,EAAG,CAAE,EAErB,KAAK,UAAU,QAAQ,KAAK,OAAO,CACvC,CAEE,cAAe,CACb,GAAI,CAAC,KAAK,aAAc,OAExB,MAAM3O,EAAO,KAAK,aAAa,YACzBtU,EAAQsU,EAAK,MAAM,SAAS,EAClC,GAAI,CAACtU,EAAO,OAEZ,MAAMkjB,EAAc,WAAWljB,EAAM,CAAC,EAAE,QAAQ,IAAK,EAAE,CAAC,EAClDkI,EAASoM,EAAK,UAAU,EAAGtU,EAAM,KAAK,EACtC+H,EAASuM,EAAK,UAAUtU,EAAM,MAAQA,EAAM,CAAC,EAAE,MAAM,EAErDmjB,EAAW,KACXld,EAAY,YAAY,MACxBmd,EAAa,EAEbC,EAAWC,GAAgB,CAC/B,MAAMC,EAAUD,EAAcrd,EACxB7C,EAAW,KAAK,IAAImgB,EAAUJ,EAAU,CAAC,EACzCK,EAAe,EAAI,KAAK,IAAI,EAAIpgB,EAAU,CAAC,EAE3CqgB,EAAeL,GAAcF,EAAcE,GAAcI,EAE/D,IAAIE,EACAR,GAAe,IACjBQ,GAAkBD,EAAe,KAAS,QAAQ,CAAC,EAAI,IAC9CP,GAAe,IACxBQ,GAAkBD,EAAe,KAAM,QAAQ,CAAC,EAAI,IAC3C,OAAO,UAAUP,CAAW,EACrCQ,EAAiB,KAAK,MAAMD,CAAY,EAAE,eAAc,EAExDC,EAAiBD,EAAa,QAAQ,CAAC,EAGzC,KAAK,aAAa,YAAcvb,EAASwb,EAAiB3b,EAEtD3E,EAAW,GACb,sBAAsBigB,CAAO,CAErC,EAEI,sBAAsBA,CAAO,CACjC,CAEE,iBAAkB,CAChB,GAAI,CAAC,KAAK,aAAc,OAExB,MAAMrG,EAAQ,KAAK,aAAa,aAAa,YAAY,GAAK,KAC9D,KAAK,aAAa,MAAM,MAAQA,CACpC,CAEE,YAAYhJ,EAAU1U,EAAU,GAAI,CAClC,GAAI,CAAC,KAAK,aAAc,OAExB,MAAM6jB,EAAW7jB,EAAQ,UAAY,IAC/BgV,EAAO,KAAK,aAAa,YACzBtU,EAAQsU,EAAK,MAAM,SAAS,EAElC,GAAI,CAACtU,EAAO,CACV,KAAK,aAAa,YAAcgU,EAChC,MACN,CAEI,MAAM9L,EAASoM,EAAK,UAAU,EAAGtU,EAAM,KAAK,EACtC+H,EAASuM,EAAK,UAAUtU,EAAM,MAAQA,EAAM,CAAC,EAAE,MAAM,EACrDojB,EAAa,WAAWpjB,EAAM,CAAC,EAAE,QAAQ,IAAK,EAAE,CAAC,EACjDkjB,EAAc,WAAWlP,CAAQ,EAEjC/N,EAAY,YAAY,MAExBod,EAAWC,GAAgB,CAC/B,MAAMC,EAAUD,EAAcrd,EACxB7C,EAAW,KAAK,IAAImgB,EAAUJ,EAAU,CAAC,EACzCK,EAAe,EAAI,KAAK,IAAI,EAAIpgB,EAAU,CAAC,EAE3CqgB,EAAeL,GAAcF,EAAcE,GAAcI,EAE/D,IAAIE,EACAR,GAAe,IACjBQ,GAAkBD,EAAe,KAAS,QAAQ,CAAC,EAAI,IAC9CP,GAAe,IACxBQ,GAAkBD,EAAe,KAAM,QAAQ,CAAC,EAAI,IAC3C,OAAO,UAAUP,CAAW,EACrCQ,EAAiB,KAAK,MAAMD,CAAY,EAAE,eAAc,EAExDC,EAAiBD,EAAa,QAAQ,CAAC,EAGzC,KAAK,aAAa,YAAcvb,EAASwb,EAAiB3b,EAEtD3E,EAAW,GACb,sBAAsBigB,CAAO,CAErC,EAEI,sBAAsBA,CAAO,CACjC,CAEE,eAAe3D,EAASpgB,EAAU,GAAI,CACpC,GAAI,CAAC,KAAK,aAAc,OAExB,MAAM6jB,EAAW7jB,EAAQ,UAAY,IAC/BqkB,EAAe,WAAW,KAAK,aAAa,MAAM,OAAS,GAAG,EAC9DC,EAAc,KAAK,IAAI,KAAK,IAAIlE,EAAS,CAAC,EAAG,GAAG,EAEhDzZ,EAAY,YAAY,MAExBod,EAAWC,GAAgB,CAC/B,MAAMC,EAAUD,EAAcrd,EACxB7C,EAAW,KAAK,IAAImgB,EAAUJ,EAAU,CAAC,EACzCK,EAAe,EAAI,KAAK,IAAI,EAAIpgB,EAAU,CAAC,EAE3CygB,EAAoBF,GAAgBC,EAAcD,GAAgBH,EACxE,KAAK,aAAa,MAAM,MAAQK,EAAoB,IAEhDzgB,EAAW,GACb,sBAAsBigB,CAAO,CAErC,EAEI,sBAAsBA,CAAO,CACjC,CAEE,SAASS,EAAWtnB,EAAO,CACzB,MAAMunB,EAAe,KAAK,QAAQ,cAAc,qBAAqB,EACrE,GAAI,CAACA,EAAc,OAEnBA,EAAa,UAAY,0CAA0CD,CAAS,GAE5E,MAAME,EAAUF,IAAc,KAC1B,sIACAA,IAAc,OACd,sIACA,+HAEJC,EAAa,UAAYC,EAAUxnB,CACvC,CAEE,SAAU,CACJ,KAAK,YACP,KAAK,UAAU,aACf,KAAK,UAAY,MAEnB,KAAK,SAAW,GAChB,KAAK,aAAe,KACpB,KAAK,aAAe,KACpB,KAAK,QAAU,IACnB,EAGA,SAASynB,EAAa7nB,EAAS,CAC7B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM2C,EAAW,IAAIgkB,EAAS3mB,CAAO,EACrCA,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAChC,CAEA,SAAS8nB,EAAgB9nB,EAAS,CAChC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEA,SAAS+nB,GAAgB,CACvB,SAAS,iBAAiB,cAAc,EAAE,QAAQC,GAAQ,CACxDH,EAAaG,CAAI,CACrB,CAAG,CACH,CAEA,SAASC,EAAe3f,EAAUsP,EAAU,CAC1C,MAAMoQ,EAAO,SAAS,cAAc1f,CAAQ,EACxC0f,GAAQA,EAAK,kBACfA,EAAK,iBAAiB,YAAYpQ,CAAQ,CAE9C,CAEqC7V,EAAO,QAC1CA,EAAA,QAAiB,CAAE,SAAA4kB,EAAU,cAAAoB,EAAe,aAAAF,EAAc,gBAAAC,EAAiB,eAAAG,IAE3E,OAAO,SAAWtB,EAClB,OAAO,aAAekB,EACtB,OAAO,gBAAkBC,GAGvB,OAAO,mBACT,OAAO,kBAAkB,SAAS,WAAYD,EAAcC,CAAe,0FCzN7E,MAAMI,CAAQ,CACZ,YAAYloB,EAASkD,EAAU,GAAI,CACjC,KAAK,QAAUlD,EACf,KAAK,KAAOkD,EAAQ,MAAQ,CAAA,EAC5B,KAAK,UAAYA,EAAQ,WAAa,KAAK,cAAa,EACxD,KAAK,QAAUA,EAAQ,SAAW,IAAI,KACtC,KAAK,SAAWA,EAAQ,UAAY,GACpC,KAAK,YAAcA,EAAQ,aAAe,KAC1C,KAAK,QAAU,KACf,KAAK,UAAYA,EAAQ,OAASlD,EAAQ,aAAa,YAAY,GAAK,UACxE,KAAK,WAAa,GAElB,KAAK,KAAI,CACb,CAEE,eAAgB,CACd,MAAMgP,EAAO,IAAI,KACjB,OAAAA,EAAK,YAAYA,EAAK,YAAW,EAAK,CAAC,EAChCA,CACX,CAEE,MAAO,CACL,KAAK,OAAM,EACX,KAAK,cAAa,CACtB,CAEE,cAAcA,EAAM,CAClB,MAAM4O,EAAU,KAAK,WAAW5O,CAAI,EAC9BzC,EAAO,KAAK,KAAK,KAAK2G,GAAKA,EAAE,OAAS0K,CAAO,EACnD,OAAOrR,EAAOA,EAAK,MAAQ,CAC/B,CAEE,WAAWyC,EAAM,CACf,MAAME,EAAOF,EAAK,cACZG,EAAQ,OAAOH,EAAK,SAAQ,EAAK,CAAC,EAAE,SAAS,EAAG,GAAG,EACnDI,EAAM,OAAOJ,EAAK,QAAO,CAAE,EAAE,SAAS,EAAG,GAAG,EAClD,MAAO,GAAGE,CAAI,IAAIC,CAAK,IAAIC,CAAG,EAClC,CAEE,SAAShP,EAAO+nB,EAAU,CACxB,GAAI/nB,IAAU,EAAG,MAAO,IACpB,CAAC+nB,GAAYA,IAAa,KAAGA,EAAW,KAAK,IAAI,GAAG,KAAK,KAAK,IAAIjV,GAAKA,EAAE,KAAK,EAAG,CAAC,GACtF,MAAMkV,EAAQhoB,EAAQ+nB,EACtB,OAAIC,EAAQ,GAAY,EACpBA,EAAQ,GAAY,EACpBA,EAAQ,GAAY,EACpBA,EAAQ,GAAY,EACjB,CACX,CAEE,SAASC,EAAK,CACZ,MAAMpnB,EAAS,4CAA4C,KAAKonB,CAAG,EACnE,OAAOpnB,EAAS,CACd,EAAG,SAASA,EAAO,CAAC,EAAG,EAAE,EACzB,EAAG,SAASA,EAAO,CAAC,EAAG,EAAE,EACzB,EAAG,SAASA,EAAO,CAAC,EAAG,EAAE,CAC/B,EAAQ,CAAE,EAAG,GAAI,EAAG,IAAK,EAAG,GAC5B,CAEE,aAAaqnB,EAAO,CAClB,MAAMC,EAAM,KAAK,SAAS,KAAK,SAAS,EACxC,GAAID,IAAU,EAAG,MAAO,qBACxB,MAAME,EAAU,CAAC,GAAK,GAAK,GAAK,GAAK,CAAC,EAAEF,EAAQ,CAAC,EACjD,MAAO,QAAQC,EAAI,CAAC,KAAKA,EAAI,CAAC,KAAKA,EAAI,CAAC,KAAKC,CAAO,GACxD,CAEE,kBAAmB,CACjB,MAAO,CAAC,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,EAAE,CACzC,CAEE,gBAAiB,CACf,MAAMC,EAAS,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,KAAK,EACnFxnB,EAAS,CAAA,EACf,IAAIynB,EAAe,GAEnB,QAASxV,EAAI,IAAI,KAAK,KAAK,SAAS,EAAGA,GAAK,KAAK,QAASA,EAAE,QAAQA,EAAE,QAAO,EAAK,CAAC,EAAG,CACpF,MAAM/D,EAAQ+D,EAAE,WACV9D,EAAM8D,EAAE,UACV/D,IAAUuZ,GAAgBtZ,IAAQ,IACpCnO,EAAO,KAAK,CAAE,MAAAkO,EAAO,MAAOsZ,EAAOtZ,CAAK,EAAG,OAAQ,KAAK,OAAO+D,EAAI,KAAK,YAAc,IAAO,GAAK,GAAK,GAAG,CAAC,CAAE,EAC7GwV,EAAevZ,EAEvB,CAEI,OAAOlO,CACX,CAEE,cAAe,CACb,IAAI0nB,EAAQ,EAEZ,MAAMC,EADU,IAAI,KAAK,KAAK,SAAS,EACN,SAEjC,QAAS1V,EAAI,IAAI,KAAK,KAAK,SAAS,EAAGA,GAAK,KAAK,QAASA,EAAE,QAAQA,EAAE,QAAO,EAAK,CAAC,EAC7EA,EAAE,OAAM,IAAO,GACjByV,IAIJ,OAAIC,IAAmB,GACrBD,IAGKA,CACX,CAEE,QAAS,CACP,MAAME,EAAO,KAAK,QAAQ,cAAc,mBAAmB,EAC3D,GAAI,CAACA,EAAM,OAEXA,EAAK,UAAY,GAEjB,MAAMF,EAAQ,CAAA,EACd,IAAIG,EAAc,CAAA,EAGlB,MAAMF,EADU,IAAI,KAAK,KAAK,SAAS,EACN,SACjC,QAAS1hB,EAAI,EAAGA,EAAI0hB,EAAgB1hB,IAClC4hB,EAAY,KAAK,IAAI,EAGvB,QAAS5V,EAAI,IAAI,KAAK,KAAK,SAAS,EAAGA,GAAK,KAAK,QAASA,EAAE,QAAQA,EAAE,QAAO,EAAK,CAAC,EACjF4V,EAAY,KAAK,IAAI,KAAK5V,CAAC,CAAC,GACxBA,EAAE,OAAM,IAAO,GAAKA,EAAE,QAAO,IAAO,KAAK,QAAQ,aACnDyV,EAAM,KAAKG,CAAW,EACtBA,EAAc,CAAA,GAIlB,MAAMC,EAAYJ,EAAM,OAClBK,EAAY,KAAK,QAAQ,UAAU,SAAS,qBAAqB,EAAI,GAAK,GAC1EC,EAAiBF,EAAYC,EAE7B7kB,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,wBAEtB,MAAM+kB,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,8BAE1B,MAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,6BAC1B,MAAMC,EAAqB,KAAK,QAAQ,UAAU,SAAS,qBAAqB,EAAI,GAAK,GACzF,KAAK,iBAAgB,EAAG,QAAQC,GAAS,CACvC,MAAMjK,EAAK,SAAS,cAAc,KAAK,EACvCA,EAAG,UAAY,4BACfA,EAAG,YAAciK,EACjBjK,EAAG,MAAM,OAASgK,EAAqB,KACvChK,EAAG,MAAM,WAAagK,EAAqB,KAC3CD,EAAc,YAAY/J,CAAE,CAClC,CAAK,EACD8J,EAAc,YAAYC,CAAa,EAEvC,MAAMG,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAY,6BAE1B,MAAMC,EAAc,SAAS,cAAc,KAAK,EAChDA,EAAY,UAAY,2BACxBA,EAAY,MAAM,MAAQN,EAAiB,KAE3C,MAAMO,EAAY,KAAK,iBACvBA,EAAU,QAAQ,CAACjd,EAAMzI,IAAU,CACjC,MAAMsb,EAAK,SAAS,cAAc,KAAK,EACvCA,EAAG,UAAY,0BACfA,EAAG,YAAc7S,EAAK,MAEtB,MAAMkd,EAAYD,EAAU1lB,EAAQ,CAAC,EACrC,IAAI4lB,EACAD,EACFC,EAAW,KAAK,MAAMD,EAAU,OAASld,EAAK,QAAU,CAAC,EAEzDmd,EAAWX,EAAY,KAAK,MAAMxc,EAAK,OAAS,CAAC,EAGnD6S,EAAG,MAAM,MAASsK,EAAWV,EAAa,KAC1CO,EAAY,YAAYnK,CAAE,CAChC,CAAK,EACDkK,EAAc,YAAYC,CAAW,EAErC,MAAMI,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,mBAEjBhB,EAAM,QAASpY,GAAS,CACtB,MAAMqZ,EAAa,SAAS,cAAc,KAAK,EAC/CA,EAAW,UAAY,0BAEvBrZ,EAAK,QAAQvB,GAAQ,CACnB,GAAIA,IAAS,KAAM,CACjB,MAAM6a,EAAY,SAAS,cAAc,KAAK,EAC9CA,EAAU,UAAY,mBACtBA,EAAU,MAAM,WAAa,SAC7BD,EAAW,YAAYC,CAAS,CAC1C,KAAe,CACL,MAAMzpB,EAAQ,KAAK,cAAc4O,CAAI,EAC/BmZ,EAAW,KAAK,IAAI,GAAG,KAAK,KAAK,IAAIjV,IAAKA,GAAE,KAAK,EAAG,CAAC,EACrDoV,GAAQ,KAAK,SAASloB,EAAO+nB,CAAQ,EAErC2B,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,mBACjBA,EAAK,QAAQ,KAAO,KAAK,WAAW9a,CAAI,EACxC8a,EAAK,QAAQ,MAAQ1pB,EACrB0pB,EAAK,MAAM,gBAAkB,KAAK,aAAaxB,EAAK,EAEpD,MAAMyB,GAAqBppB,IAAM,KAAK,YAAYA,GAAGqO,EAAM5O,CAAK,EAC1D4pB,GAAoB,IAAM,KAAK,cAC/B/H,GAAe,IAAM,CACrB,KAAK,aACP,KAAK,YAAY,CAAE,KAAM,KAAK,WAAWjT,CAAI,EAAG,MAAA5O,CAAK,CAAE,CAErE,EAEU0pB,EAAK,iBAAiB,aAAcC,EAAiB,EACrDD,EAAK,iBAAiB,aAAcE,EAAiB,EACrDF,EAAK,iBAAiB,QAAS7H,EAAY,EAE3C,KAAK,WAAW,KACd,CAAE,GAAI6H,EAAM,MAAO,aAAc,QAASC,EAAiB,EAC3D,CAAE,GAAID,EAAM,MAAO,aAAc,QAASE,EAAiB,EAC3D,CAAE,GAAIF,EAAM,MAAO,QAAS,QAAS7H,EAAY,CAC7D,EAEU2H,EAAW,YAAYE,CAAI,CACrC,CACA,CAAO,EAEDH,EAAK,YAAYC,CAAU,CACjC,CAAK,EAEDN,EAAc,YAAYK,CAAI,EAC9BT,EAAc,YAAYI,CAAa,EACvCnlB,EAAU,YAAY+kB,CAAa,EAEnCL,EAAK,YAAY1kB,CAAS,EAC1B,KAAK,aAAa0kB,CAAI,CAC1B,CAEE,aAAa9R,EAAQ,CACnB,MAAMkT,EAAS,SAAS,cAAc,KAAK,EAC3CA,EAAO,UAAY,qBAEnB,MAAMZ,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,UAAY,2BAClBA,EAAM,YAAc,IAEpB,MAAMa,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,2BAElB,QAAShjB,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,MAAM4iB,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,UAAY,0BACjBA,EAAK,MAAM,gBAAkB,KAAK,aAAa5iB,CAAC,EAChDgjB,EAAM,YAAYJ,CAAI,CAC5B,CAEI,MAAMK,EAAS,SAAS,cAAc,MAAM,EAC5CA,EAAO,UAAY,2BACnBA,EAAO,YAAc,IAErBF,EAAO,YAAYZ,CAAK,EACxBY,EAAO,YAAYC,CAAK,EACxBD,EAAO,YAAYE,CAAM,EACzBpT,EAAO,YAAYkT,CAAM,CAC7B,CAEE,eAAgB,CACd,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,sBACzB,SAAS,KAAK,YAAY,KAAK,OAAO,CAC1C,CAEE,YAAYtpB,EAAGqO,EAAM5O,EAAO,CAC1B,MAAMgqB,EAAOzpB,EAAE,OAAO,sBAAqB,EACrC0pB,EAAe,IAErB,KAAK,QAAQ,UAAY;AAAA,8CACiBrb,EAAK,aAAa,IAAIA,EAAK,SAAQ,EAAK,CAAC,IAAIA,EAAK,QAAO,CAAE;AAAA,+CAC1D5O,CAAK;AAAA,MAGhD,KAAK,QAAQ,MAAM,KAAO,KAAK,IAAIgqB,EAAK,KAAOA,EAAK,MAAQ,EAAIC,EAAe,EAAG,OAAO,WAAaA,EAAe,EAAE,EAAI,KAC3H,KAAK,QAAQ,MAAM,IAAOD,EAAK,IAAM,GAAM,KAC3C,KAAK,QAAQ,UAAU,IAAI,YAAY,CAC3C,CAEE,aAAc,CACZ,KAAK,QAAQ,UAAU,OAAO,YAAY,CAC9C,CAEE,WAAW3pB,EAAM,CACf,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAA2e,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAClD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CAC3C,CAAK,EACD,KAAK,WAAa,GAClB,KAAK,KAAOD,EACZ,KAAK,OAAM,CACf,CAEE,aAAa6pB,EAAWC,EAAS,CAC/B,KAAK,UAAYD,EACjB,KAAK,QAAUC,EACf,KAAK,OAAM,CACf,CAEE,SAAU,CACR,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAAnL,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAClD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CAC3C,CAAK,EACD,KAAK,WAAa,KAEd,KAAK,SAAW,KAAK,QAAQ,YAC/B,KAAK,QAAQ,WAAW,YAAY,KAAK,OAAO,EAElD,KAAK,QAAU,KACf,KAAK,KAAO,GACZ,KAAK,QAAU,IACnB,EAGA,SAAS8pB,EAAYxqB,EAAS,CAC5B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAMyqB,EAAWzqB,EAAQ,aAAa,mBAAmB,EACzD,IAAIS,EAAO,CAAA,EAEX,GAAIgqB,EACF,GAAI,CACFhqB,EAAO,KAAK,MAAMgqB,CAAQ,CAChC,MAAgB,CACVhqB,EAAOiqB,EAAuB,CACpC,MAEIjqB,EAAOiqB,EAAuB,EAGhC,MAAM/nB,EAAW,IAAIulB,EAAQloB,EAAS,CACpC,KAAMS,EACN,YAAckqB,GAAS,CAC3B,CACA,CAAG,EAED3qB,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAChC,CAEA,SAAS4qB,EAAe5qB,EAAS,CAC/B,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEA,SAAS6qB,GAAe,CACtB,SAAS,iBAAiB,aAAa,EAAE,QAAQ7qB,GAAW,CAC1DwqB,EAAYxqB,CAAO,CACvB,CAAG,CACH,CAEA,SAAS0qB,GAA0B,CACjC,MAAMjqB,EAAO,CAAA,EACPod,EAAQ,IAAI,KACZiN,EAAa,IAAI,KACvBA,EAAW,YAAYA,EAAW,YAAW,EAAK,CAAC,EAEnD,QAAS5X,EAAI,IAAI,KAAK4X,CAAU,EAAG5X,GAAK2K,EAAO3K,EAAE,QAAQA,EAAE,QAAO,EAAK,CAAC,EAAG,CACzE,MAAMhE,EAAOgE,EAAE,cACT/D,EAAQ,OAAO+D,EAAE,SAAQ,EAAK,CAAC,EAAE,SAAS,EAAG,GAAG,EAChD9D,EAAM,OAAO8D,EAAE,QAAO,CAAE,EAAE,SAAS,EAAG,GAAG,EAGzC6X,EADY7X,EAAE,OAAM,IAAO,GAAKA,EAAE,OAAM,IAAO,EACvB,KAAK,OAAM,EAAK,GAAK,KAAK,OAAM,EAAK,GAC7D9S,EAAQ,KAAK,MAAM2qB,CAAS,EAElCtqB,EAAK,KAAK,CACR,KAAM,GAAGyO,CAAI,IAAIC,CAAK,IAAIC,CAAG,GAC7B,MAAOhP,EAAQ,EAAIA,EAAQ,KAAK,MAAM,KAAK,OAAM,EAAK,EAAE,EAAI,CAClE,CAAK,CACL,CAEE,OAAOK,CACT,CAEA,SAASuqB,EAAc1iB,EAAUpF,EAAU,GAAI,CAC7C,MAAMlD,EAAU,SAAS,cAAcsI,CAAQ,EAC/C,GAAItI,EAAS,CACX,MAAMS,EAAOyC,EAAQ,MAAQwnB,EAAuB,EACpD,OAAO,IAAIxC,EAAQloB,EAAS,CAC1B,KAAMS,EACN,GAAGyC,CACT,CAAK,CACL,CACE,OAAO,IACT,CAEqCnB,EAAO,QAC1CA,EAAA,QAAiB,CAAE,QAAAmmB,EAAS,aAAA2C,EAAc,YAAAL,EAAa,eAAAI,EAAgB,cAAAI,EAAe,wBAAAN,IAEtF,OAAO,QAAUxC,EACjB,OAAO,YAAcsC,EACrB,OAAO,eAAiBI,GAGtB,OAAO,mBACT,OAAO,kBAAkB,SAAS,UAAWJ,EAAaI,CAAc,wBCnZ1E,MAAMK,EAAQ,CACZ,YAAYjrB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,UAAY,KAEjB,KAAK,aAAe,KACpB,KAAK,aAAe,IACtB,CAEA,MAAO,CACD,KAAK,QAAQ,sBAEjB,KAAK,aAAe,IAAM,CACxB,MAAMkY,EAAO,KAAK,QAAQ,aAAa,cAAc,EAC/CgT,EAAW,KAAK,QAAQ,aAAa,uBAAuB,GAAK,MAClEhT,IAEL,KAAK,UAAY,SAAS,cAAc,KAAK,EAC7C,KAAK,UAAU,UAAY,wBAC3B,KAAK,UAAU,YAAcA,EAE7B,SAAS,KAAK,YAAY,KAAK,SAAS,EAExC,sBAAsB,IAAM,CAC1B,MAAMkS,EAAO,KAAK,QAAQ,sBAAqB,EACzCe,EAAc,KAAK,UAAU,sBAAqB,EAClDC,EAAgB,OAAO,WACvBC,EAAiB,OAAO,YAE9B,IAAIC,EAAMC,EAEV,OAAQL,EAAQ,CACd,IAAK,SACHI,EAAOlB,EAAK,KAAOA,EAAK,MAAQ,EAAIe,EAAY,MAAQ,EACxDI,EAAMnB,EAAK,OAAS,EACpB,MACF,IAAK,QACHkB,EAAOlB,EAAK,MAAQ,EACpBmB,EAAMnB,EAAK,IAAMA,EAAK,OAAS,EAAIe,EAAY,OAAS,EACxD,MACF,IAAK,OACHG,EAAOlB,EAAK,KAAOe,EAAY,MAAQ,EACvCI,EAAMnB,EAAK,IAAMA,EAAK,OAAS,EAAIe,EAAY,OAAS,EACxD,MACF,IAAK,MACL,QACEG,EAAOlB,EAAK,KAAOA,EAAK,MAAQ,EAAIe,EAAY,MAAQ,EACxDI,EAAMnB,EAAK,IAAMe,EAAY,OAAS,EACtC,KACZ,CAEYG,EAAO,IAAGA,EAAO,GACjBA,EAAOH,EAAY,MAAQC,IAAeE,EAAOF,EAAgBD,EAAY,MAAQ,GACrFI,EAAM,IAAGA,EAAM,GACfA,EAAMJ,EAAY,OAASE,IAAgBE,EAAMF,EAAiBF,EAAY,OAAS,GAE3F,KAAK,UAAU,MAAM,KAAO,GAAGG,CAAI,KACnC,KAAK,UAAU,MAAM,IAAM,GAAGC,CAAG,KACjC,KAAK,UAAU,MAAM,SAAW,OAClC,CAAC,EACH,EAEA,KAAK,aAAe,IAAM,CACpB,KAAK,YACP,KAAK,UAAU,SACf,KAAK,UAAY,KAErB,EAEA,KAAK,QAAQ,iBAAiB,aAAc,KAAK,YAAY,EAC7D,KAAK,QAAQ,iBAAiB,aAAc,KAAK,YAAY,EAC7D,KAAK,QAAQ,iBAAiB,QAAS,KAAK,YAAY,EACxD,KAAK,QAAQ,iBAAiB,OAAQ,KAAK,YAAY,EAEvD,KAAK,QAAQ,oBAAsB,GACrC,CAEA,SAAU,CACH,KAAK,QAAQ,sBAEd,KAAK,eACP,KAAK,QAAQ,oBAAoB,aAAc,KAAK,YAAY,EAChE,KAAK,QAAQ,oBAAoB,QAAS,KAAK,YAAY,GAGzD,KAAK,eACP,KAAK,QAAQ,oBAAoB,aAAc,KAAK,YAAY,EAChE,KAAK,QAAQ,oBAAoB,OAAQ,KAAK,YAAY,GAGxD,KAAK,cAAgB,KAAK,cAC5B,KAAK,aAAY,EAGnB,KAAK,aAAe,KACpB,KAAK,aAAe,KACpB,KAAK,QAAQ,oBAAsB,GACrC,CACF,CAEA,SAASC,GAAYxrB,EAAS,CAC5B,MAAMyrB,EAAU,IAAIR,GAAQjrB,CAAO,EACnCyrB,EAAQ,KAAI,EACZzrB,EAAQ,eAAiByrB,CAC3B,CAQA,SAASC,GAAe1rB,EAAS,CAC3BA,EAAQ,iBACVA,EAAQ,eAAe,UACvBA,EAAQ,eAAiB,KAE7B,CAEI,OAAO,mBACT,OAAO,kBAAkB,SAAS,UAAWwrB,GAAaE,EAAc,ECxH1E,MAAMC,EAAgB,CACpB,aAAc,CACZ,KAAK,WAAa,CAChB,SAAU,KAAK,iBACf,MAAO,KAAK,cACZ,IAAK,KAAK,YACV,UAAW,KAAK,kBAChB,UAAW,KAAK,kBAChB,QAAS,KAAK,gBACd,IAAK,KAAK,YACV,IAAK,KAAK,YACV,QAAS,KAAK,gBACd,MAAO,KAAK,cACZ,KAAM,KAAK,aACX,OAAQ,KAAK,cACnB,EAEI,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,sBAAwB,GAC7B,KAAK,WAAa,GAClB,KAAK,WAAa,IAAI,GACxB,CAEA,aAAaxrB,EAAM6W,EAAU,CAC3B,KAAK,iBAAiB7W,CAAI,EAAI6W,CAChC,CAEA,kBAAkB7W,EAAM6W,EAAU,CAChC,KAAK,sBAAsB7W,CAAI,EAAI6W,CACrC,CAEA,SAAS4U,EAAM,CACb,MAAMC,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GACnE3Z,EAAS,CAAA,EACT6Z,EAASF,EAAK,iBAAiB,iBAAiB,EACtD,IAAIG,EAAW,GAEf,OAAAD,EAAO,QAAQ7O,GAAS,CACtB,MAAM9c,EAAO8c,EAAM,MAAQA,EAAM,GAC3BjL,EAAQ,KAAK,WAAWiL,EAAM,aAAa,eAAe,CAAC,EAC3D7c,EAAQ,KAAK,SAAS6c,CAAK,EAEjC,SAAW,CAAC7K,EAAMvO,CAAM,IAAK,OAAO,QAAQmO,CAAK,EAG/C,IAFsB,KAAK,iBAAiBI,CAAI,GAAK,KAAK,WAAWA,CAAI,KACzChS,EAAOyD,CAAM,EAO3C,KAAK,WAAWoZ,CAAK,MANT,CACZhL,EAAO9R,CAAI,EAAI,KAAK,gBAAgBiS,EAAMvO,EAAQoZ,CAAK,EACvD,KAAK,UAAUA,EAAOhL,EAAO9R,CAAI,CAAC,EAClC4rB,EAAW,GACX,KACF,CAIJ,CAAC,EAED,KAAK,WAAWF,CAAM,EAAI,CACxB,MAAO,CAACE,EACR,OAAQ9Z,EACR,WAAY,OAAO,KAAKA,CAAM,EAAE,MACtC,EAEI,KAAK,gBAAgB2Z,CAAI,EAElB,CAACG,CACV,CAEA,SAAS9O,EAAO,CACd,GAAIA,EAAM,UAAU,SAAS,sBAAsB,GAAKA,EAAM,UAAU,SAAS,sBAAsB,EACrG,OAAOA,EAAM,MAAM,OAGrB,GAAIA,EAAM,QAAQ,YAAY,EAAG,CAC/B,MAAMV,EAASU,EAAM,QAAQ,YAAY,EACnC+O,EAAUzP,EAAO,cAAc,mBAAmB,GAAKA,EAAO,cAAc,0BAA0B,EAC5G,OAAOyP,EAAUA,EAAQ,YAAY,KAAI,EAAK,EAChD,CAEA,GAAI/O,EAAM,QAAQ,gBAAgB,EAAG,CAEnC,MAAMgP,EADShP,EAAM,QAAQ,gBAAgB,EACf,qBAC9B,OAAOgP,GAAkBA,EAAe,SAAQ,EAAG,OAAS,EAAI,YAAc,EAChF,CAEA,OAAOhP,EAAM,MAAM,MACrB,CAEA,cAAcA,EAAO,CACnB,MAAMjL,EAAQ,KAAK,WAAWiL,EAAM,aAAa,eAAe,CAAC,EAC3D7c,EAAQ,KAAK,SAAS6c,CAAK,EAEjC,SAAW,CAAC7K,EAAMvO,CAAM,IAAK,OAAO,QAAQmO,CAAK,EAG/C,GAAI,EAFkB,KAAK,iBAAiBI,CAAI,GAAK,KAAK,WAAWA,CAAI,KACzChS,EAAOyD,CAAM,EAE3C,YAAK,UAAUoZ,EAAO,KAAK,gBAAgB7K,EAAMvO,EAAQoZ,CAAK,CAAC,EACxD,GAIX,YAAK,WAAWA,CAAK,EACd,EACT,CAEA,aAAc,CACZ,MAAMiP,EAAQ,SAAS,iBAAiB,uBAAuB,EAC/D,IAAIC,EAAW,GAEf,OAAAD,EAAM,QAAQN,GAAQ,CACf,KAAK,SAASA,CAAI,IACrBO,EAAW,GAEf,CAAC,EAEMA,CACT,CAEA,MAAM,cAAcP,EAAM1oB,EAAU,GAAI,CACtC,MAAM2oB,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAEnEQ,EAAQlpB,EAAQ,MAChB4oB,EAASM,EACXR,EAAK,iBAAiB,wCAAwCQ,CAAK,IAAI,EACvER,EAAK,iBAAiB,iBAAiB,EAE3C,IAAIG,EAAW,GAEf,UAAW9O,KAAS6O,EACF,MAAM,KAAK,mBAAmB7O,CAAK,IAEjD8O,EAAW,IAIf,MAAMM,EAAa,CAAA,EACnB,OAAAP,EAAO,QAAQ7O,GAAS,CACtB,MAAM9c,EAAO8c,EAAM,MAAQA,EAAM,GAC3BgG,EAAehG,EAAM,cAAc,cAAc,kBAAkB,EACrEgG,IACFoJ,EAAWlsB,CAAI,EAAI8iB,EAAa,YAEpC,CAAC,EAED,KAAK,WAAW4I,CAAM,EAAI,CACxB,MAAO,CAACE,EACR,OAAQM,EACR,WAAY,OAAO,KAAKA,CAAU,EAAE,MAC1C,EAEI,KAAK,gBAAgBT,CAAI,EAElB,CAACG,CACV,CAEA,MAAM,mBAAmB9O,EAAO,CAC9B,MAAMjL,EAAQ,KAAK,WAAWiL,EAAM,aAAa,eAAe,CAAC,EAC3DqP,EAAa,KAAK,WAAWrP,EAAM,aAAa,qBAAqB,GAAK,EAAE,EAC5E7c,EAAQ,KAAK,SAAS6c,CAAK,EAEjC,SAAW,CAAC7K,EAAMvO,CAAM,IAAK,OAAO,QAAQmO,CAAK,EAG/C,GAAI,EAFkB,KAAK,iBAAiBI,CAAI,GAAK,KAAK,WAAWA,CAAI,KACzChS,EAAOyD,CAAM,EAE3C,YAAK,UAAUoZ,EAAO,KAAK,gBAAgB7K,EAAMvO,EAAQoZ,CAAK,CAAC,EACxD,GAIX,SAAW,CAAC7K,EAAMvO,CAAM,IAAK,OAAO,QAAQyoB,CAAU,EAAG,CACvD,MAAMC,EAAgB,KAAK,sBAAsBna,CAAI,GAAK,KAAK,gBAAgBA,CAAI,EACnF,GAAIma,EACF,GAAI,CAEF,GAAI,CADY,MAAMA,EAAcnsB,EAAOyD,EAAQoZ,CAAK,EAEtD,YAAK,UAAUA,EAAO,KAAK,gBAAgB7K,EAAMvO,EAAQoZ,CAAK,CAAC,EACxD,EAEX,OAAStc,EAAG,CACV,YAAK,UAAUsc,EAAOtc,EAAE,SAAW,kBAAkB,EAC9C,EACT,CAEJ,CAEA,YAAK,WAAWsc,CAAK,EACd,EACT,CAEA,MAAM,cAAc2O,EAAMY,EAAW,CACnC,MAAMV,EAASF,EAAK,iBAAiB,wCAAwCY,CAAS,IAAI,EAC1F,IAAIT,EAAW,GAEf,UAAW9O,KAAS6O,EACF,MAAM,KAAK,mBAAmB7O,CAAK,IAEjD8O,EAAW,IAIf,MAAO,CAACA,CACV,CAEA,UAAUH,EAAM,CACd,MAAMa,EAAS,IAAI,IACnB,OAAAb,EAAK,iBAAiB,uBAAuB,EAAE,QAAQ3O,GAAS,CAC9DwP,EAAO,IAAIxP,EAAM,aAAa,qBAAqB,CAAC,CACtD,CAAC,EACM,MAAM,KAAKwP,CAAM,CAC1B,CAEA,aAAab,EAAM,CACjB,MAAMC,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GACzE,OAAO,KAAK,WAAWC,CAAM,GAAK,CAAE,MAAO,GAAM,OAAQ,CAAA,EAAI,WAAY,EAAG,QAAS,GAAO,WAAY,GAAO,SAAU,GAC3H,CAEA,gBAAgBD,EAAM,CACpB,MAAM3Y,EAAQ,KAAK,aAAa2Y,CAAI,EAEhC3Y,EAAM,OACR2Y,EAAK,UAAU,OAAO,kBAAkB,EACxCA,EAAK,UAAU,IAAI,gBAAgB,IAEnCA,EAAK,UAAU,OAAO,gBAAgB,EACtCA,EAAK,UAAU,IAAI,kBAAkB,GAGnC3Y,EAAM,QACR2Y,EAAK,UAAU,IAAI,kBAAkB,EAErCA,EAAK,UAAU,OAAO,kBAAkB,EAGtC3Y,EAAM,WACR2Y,EAAK,UAAU,IAAI,qBAAqB,EAExCA,EAAK,UAAU,OAAO,qBAAqB,EAGzC3Y,EAAM,UACR2Y,EAAK,UAAU,IAAI,mBAAmB,EACtCA,EAAK,iBAAiB,iCAAiC,EAAE,QAAQxM,GAAMA,EAAG,SAAW,EAAI,IAEzFwM,EAAK,UAAU,OAAO,mBAAmB,EACzCA,EAAK,iBAAiB,iCAAiC,EAAE,QAAQxM,GAAM,CAChEA,EAAG,aAAa,yBAAyB,IAC5CA,EAAG,SAAW,GAElB,CAAC,GAGH,MAAMsN,EAAgBd,EAAK,cAAc,kBAAkB,EACvDc,IACEzZ,EAAM,WAAa,GACrByZ,EAAc,YAAc,GAAGzZ,EAAM,UAAU,IAAIA,EAAM,aAAe,EAAI,QAAU,QAAQ,SAC9FyZ,EAAc,UAAU,IAAI,wBAAwB,IAEpDA,EAAc,YAAc,uBAC5BA,EAAc,UAAU,OAAO,wBAAwB,GAG7D,CAEA,eAAed,EAAMe,EAAS,CAC5B,MAAMd,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GACpE,KAAK,WAAWC,CAAM,IACzB,KAAK,WAAWA,CAAM,EAAI,CAAE,MAAO,GAAM,OAAQ,CAAA,EAAI,WAAY,EAAG,QAAS,GAAO,WAAY,GAAO,SAAU,KAEnH,KAAK,WAAWA,CAAM,EAAE,QAAUc,EAClC,KAAK,gBAAgBf,CAAI,CAC3B,CAEA,kBAAkBA,EAAMgB,EAAY,CAClC,MAAMf,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GACpE,KAAK,WAAWC,CAAM,IACzB,KAAK,WAAWA,CAAM,EAAI,CAAE,MAAO,GAAM,OAAQ,CAAA,EAAI,WAAY,EAAG,QAAS,GAAO,WAAY,GAAO,SAAU,KAEnH,KAAK,WAAWA,CAAM,EAAE,WAAae,EACrC,KAAK,gBAAgBhB,CAAI,CAC3B,CAEA,gBAAgBA,EAAMiB,EAAU,CAC9B,MAAMhB,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GACpE,KAAK,WAAWC,CAAM,IACzB,KAAK,WAAWA,CAAM,EAAI,CAAE,MAAO,GAAM,OAAQ,CAAA,EAAI,WAAY,EAAG,QAAS,GAAO,WAAY,GAAO,SAAU,KAEnH,KAAK,WAAWA,CAAM,EAAE,SAAWgB,EACnC,KAAK,gBAAgBjB,CAAI,CAC3B,CAEA,UAAUA,EAAM,CACd,MAAMC,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GACzE,KAAK,WAAWC,CAAM,EAAI,CAAE,MAAO,GAAM,OAAQ,CAAA,EAAI,WAAY,EAAG,QAAS,GAAO,WAAY,GAAO,SAAU,IACjHD,EAAK,MAAK,EACVA,EAAK,iBAAiB,kBAAkB,EAAE,QAAQxM,GAAM,CACtDA,EAAG,UAAU,OAAO,iBAAiB,EACrC,MAAM6D,EAAe7D,EAAG,eAAe,cAAc,kBAAkB,EACnE6D,IACFA,EAAa,YAAc,GAE/B,CAAC,EACD,KAAK,gBAAgB2I,CAAI,CAC3B,CAEA,WAAWkB,EAAa,CACtB,MAAM9a,EAAQ,CAAA,EAGd,OAFc8a,EAAY,MAAM,GAAG,EAE7B,QAAQ/W,GAAQ,CACpB,KAAM,CAAC3D,EAAMvO,CAAM,EAAIkS,EAAK,MAAM,GAAG,EACrC/D,EAAMI,CAAI,EAAIvO,EAASA,EAAO,MAAM,GAAG,EAAI,EAC7C,CAAC,EAEMmO,CACT,CAEA,iBAAiB5R,EAAO,CACtB,OAAOA,IAAU,EACnB,CAEA,cAAcA,EAAO,CAEnB,MADmB,6BACD,KAAKA,CAAK,CAC9B,CAEA,YAAYA,EAAO,CAEjB,MADiB,6DACD,KAAKA,CAAK,CAC5B,CAEA,kBAAkBA,EAAO,CAACmO,CAAG,EAAG,CAC9B,OAAOnO,EAAM,QAAU,SAASmO,CAAG,CACrC,CAEA,kBAAkBnO,EAAO,CAACqK,CAAG,EAAG,CAC9B,OAAOrK,EAAM,QAAU,SAASqK,CAAG,CACrC,CAEA,gBAAgBrK,EAAO,CAAC2sB,CAAO,EAAG,CAEhC,OADc,IAAI,OAAOA,CAAO,EACnB,KAAK3sB,CAAK,CACzB,CAEA,YAAYA,EAAO,CAACmO,CAAG,EAAG,CACxB,OAAO,WAAWnO,CAAK,GAAK,WAAWmO,CAAG,CAC5C,CAEA,YAAYnO,EAAO,CAACqK,CAAG,EAAG,CACxB,OAAO,WAAWrK,CAAK,GAAK,WAAWqK,CAAG,CAC5C,CAEA,gBAAgBrK,EAAO,CAAC4sB,CAAQ,EAAG,CACjC,MAAM5W,EAAS,SAAS,eAAe4W,CAAQ,EAC/C,OAAO5W,GAAUhW,IAAUgW,EAAO,KACpC,CAEA,cAAchW,EAAO,CAEnB,MADmB,yBACD,KAAKA,CAAK,CAC9B,CAEA,aAAaA,EAAO,CAElB,MADkB,4BACD,KAAKA,CAAK,GAAK,CAAC,MAAM,KAAK,MAAMA,CAAK,CAAC,CAC1D,CAEA,eAAeA,EAAO,CACpB,MAAO,CAAC,MAAM,WAAWA,CAAK,CAAC,GAAK,SAASA,CAAK,CACpD,CAEA,UAAU6c,EAAO5K,EAAS,CACxB4K,EAAM,UAAU,IAAI,iBAAiB,EACrCA,EAAM,UAAU,OAAO,mBAAmB,EAC1CA,EAAM,aAAa,eAAgB,MAAM,EAEzC,IAAIgG,EAAehG,EAAM,cAAc,cAAc,kBAAkB,EAClEgG,IACHA,EAAe,SAAS,cAAc,MAAM,EAC5CA,EAAa,UAAY,kBACzBA,EAAa,aAAa,OAAQ,OAAO,EACzCA,EAAa,aAAa,YAAa,QAAQ,EAC/ChG,EAAM,cAAc,YAAYgG,CAAY,GAE9CA,EAAa,YAAc5Q,EAE3B,KAAK,iBAAiB4K,CAAK,EAE3BA,EAAM,cAAc,IAAI,YAAY,mBAAoB,CAAE,OAAQ,CAAE,QAAA5K,EAAS,CAAE,CAAC,CAClF,CAEA,WAAW4K,EAAO,CAChBA,EAAM,UAAU,OAAO,iBAAiB,EACxCA,EAAM,aAAa,eAAgB,OAAO,EAE1C,MAAMgG,EAAehG,EAAM,cAAc,cAAc,kBAAkB,EACrEgG,GACFA,EAAa,OAAM,EAGrBhG,EAAM,cAAc,IAAI,YAAY,oBAAoB,CAAC,CAC3D,CAEA,YAAYA,EAAO,CACjBA,EAAM,UAAU,IAAI,mBAAmB,EACvCA,EAAM,UAAU,OAAO,iBAAiB,EACxCA,EAAM,aAAa,eAAgB,OAAO,EAE1C,KAAK,iBAAiBA,CAAK,EAE3B,MAAM/C,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UAAY,uDACjBA,EAAK,UAAY,+IAEjB+C,EAAM,cAAc,YAAY/C,CAAI,CACtC,CAEA,iBAAiB+C,EAAO,CACtB,MAAM/C,EAAO+C,EAAM,cAAc,cAAc,wBAAwB,EACnE/C,GACFA,EAAK,OAAM,CAEf,CAEA,gBAAgB9H,EAAMvO,EAAQoZ,EAAO,CACnC,MAAMgQ,EAAgBhQ,EAAM,aAAa,gBAAgB7K,CAAI,EAAE,EAC/D,OAAI6a,GAEa,CACf,SAAU,yBACV,MAAO,qCACP,IAAK,2BACL,UAAW,qBAAqBppB,EAAO,CAAC,CAAC,cACzC,UAAW,qBAAqBA,EAAO,CAAC,CAAC,cACzC,QAAS,6BACT,IAAK,oBAAoBA,EAAO,CAAC,CAAC,GAClC,IAAK,oBAAoBA,EAAO,CAAC,CAAC,GAClC,QAAS,sBACT,MAAO,oCACP,KAAM,yCACN,OAAQ,6BACd,EACoBuO,CAAI,GAAK,eAC3B,CACF,CAEA,MAAM8a,EAAY,IAAIvB,GAEjB,OAAO,gCACV,OAAO,8BAAgC,GACvC,SAAS,iBAAiB,mBAAoB,IAAM,CACpD,SAAS,iBAAiB,uBAAuB,EAAE,QAAQC,GAAQ,CACjEA,EAAK,iBAAiB,SAAU,MAAOjrB,GAAM,CAC3C,MAAMkrB,EAASD,EAAK,IAAM,QAAQ,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAEzE,GAAIsB,EAAU,WAAW,IAAIrB,CAAM,EAAG,CACpClrB,EAAE,eAAc,EAChB,MACF,CAEAA,EAAE,eAAc,EAEhB,MAAMwsB,EAAqBvB,EAAK,cAAc,uBAAuB,IAAM,KAE3E,IAAIwB,EAOJ,GANID,EACFC,EAAU,MAAMF,EAAU,cAActB,CAAI,EAE5CwB,EAAUF,EAAU,SAAStB,CAAI,EAG9BwB,EAKE,CACLF,EAAU,WAAW,IAAIrB,CAAM,EAC/B,MAAMwB,EAAYzB,EAAK,cAAc,uBAAuB,EAC5D,GAAIyB,EAAW,CACb,MAAMC,EAAeD,EAAU,YAC/BA,EAAU,aAAa,qBAAsBC,CAAY,EACzDD,EAAU,YAAc,gBACxBA,EAAU,SAAW,EACvB,CAEA,GAAI,CACF,MAAME,EAAW3B,EAAK,aAAa,gBAAgB,EAC/C2B,GAAY,OAAOA,CAAQ,EAC7B,MAAM,OAAOA,CAAQ,EAAE3B,CAAI,EAE3BA,EAAK,OAAM,CAEf,QAAC,CACCsB,EAAU,WAAW,OAAOrB,CAAM,EAC9BwB,IACFA,EAAU,YAAcA,EAAU,aAAa,oBAAoB,GAAK,SACxEA,EAAU,SAAW,GAEzB,CACF,KA7Bc,CACZ,MAAMG,EAAa5B,EAAK,cAAc,kBAAkB,EACpD4B,GACFA,EAAW,MAAK,CAEpB,CAyBF,CAAC,EAED5B,EAAK,iBAAiB,iBAAiB,EAAE,QAAQ3O,GAAS,CACxDA,EAAM,iBAAiB,OAAQ,IAAM,CACnC,WAAW,IAAM,CACf,MAAMwQ,EAAgB,SAAS,cAC/B,GAAIA,GAAiBA,EAAc,QAAQ,YAAY,EACrD,OAEcP,EAAU,cAAcjQ,CAAK,GAC9BA,EAAM,MAAM,KAAI,GAC7BiQ,EAAU,YAAYjQ,CAAK,CAE/B,EAAG,EAAE,CACP,CAAC,EAUD,MAAMyQ,GARW,CAACld,EAAMC,IAAS,CAC/B,IAAIjL,EACJ,MAAO,IAAI1D,IAAS,CAClB,aAAa0D,CAAO,EACpBA,EAAU,WAAW,IAAMgL,EAAK,MAAMmd,OAAM7rB,CAAI,EAAG2O,CAAI,CACzD,CACF,GAEiC,IAAM,CACrC,MAAMrQ,EAAQ8sB,EAAU,SAASjQ,CAAK,EAClC7c,EAAM,OAAS,GAAK6c,EAAM,UAAU,SAAS,iBAAiB,EAChDiQ,EAAU,cAAcjQ,CAAK,GAC9B7c,GACb8sB,EAAU,YAAYjQ,CAAK,EAG7BiQ,EAAU,iBAAiBjQ,CAAK,CAEpC,EAAG,GAAG,EAENA,EAAM,iBAAiB,QAASyQ,CAAe,EAE/CzQ,EAAM,iBAAiB,QAAUtc,GAAM,CACjCA,EAAE,MAAQ,SACIusB,EAAU,cAAcjQ,CAAK,GAC9BA,EAAM,MAAM,KAAI,GAC7BiQ,EAAU,YAAYjQ,CAAK,CAGjC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC,GAGD,OAAO,gBAAkB0O,GACzB,OAAO,gBAAkBuB,oECxiBzB,MAAMU,CAAY,CAChB,YAAY5tB,EAASkD,EAAU,GAAI,CACjC,KAAK,QAAUlD,EACf,KAAK,KAAOkD,EAAQ,MAAQ,CAAA,EAC5B,KAAK,WAAaA,EAAQ,YAAc,GACxC,KAAK,UAAYA,EAAQ,WAAa,IACtC,KAAK,WAAaA,EAAQ,YAAc,EACxC,KAAK,WAAaA,EAAQ,YAAc,KAAK,kBAC7C,KAAK,YAAcA,EAAQ,aAAe,KAC1C,KAAK,aAAeA,EAAQ,cAAgB,KAC5C,KAAK,SAAWA,EAAQ,UAAY,KACpC,KAAK,YAAcA,EAAQ,aAAe,KAC1C,KAAK,YAAcA,EAAQ,aAAe,KAC1C,KAAK,SAAWA,EAAQ,UAAY,KACpC,KAAK,iBAAmBA,EAAQ,kBAAoB,GACpD,KAAK,mBAAqB,IAAI,IAC9B,KAAK,gBAAkBA,EAAQ,iBAAmB,GAElD,KAAK,UAAY,KACjB,KAAK,eAAiB,KACtB,KAAK,eAAiB,KACtB,KAAK,YAAc,EACnB,KAAK,WAAa,EAClB,KAAK,SAAW,EAChB,KAAK,YAAc,GACnB,KAAK,cAAgB,KACrB,KAAK,cAAgB,EACrB,KAAK,eAAiB,EAEtB,KAAK,KAAI,CACb,CAEE,kBAAkBqJ,EAAMzI,EAAO,CAC7B,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAY0CyI,EAAK,OAASA,EAAK,MAAQ,QAAQzI,EAAQ,CAAC,EAAE;AAAA,wDAC3CyI,EAAK,UAAY,UAAU;AAAA;AAAA;AAAA,KAInF,CAEE,MAAO,CACL,KAAK,gBAAe,EACpB,KAAK,OAAM,EACX,KAAK,WAAU,CACnB,CAEE,iBAAkB,CAChB,KAAK,QAAQ,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASzB,KAAK,UAAY,KAAK,QAAQ,cAAc,6BAA6B,EACzE,KAAK,eAAiB,KAAK,QAAQ,cAAc,mCAAmC,CACxF,CAEE,YAAa,CACX,KAAK,eAAkB5L,GAAM,KAAK,aAAaA,CAAC,EAChD,KAAK,uBAA0BA,GAAM,KAAK,qBAAqBA,CAAC,EAChE,KAAK,sBAAyBA,GAAM,KAAK,oBAAoBA,CAAC,EAC9D,KAAK,qBAAuB,IAAM,KAAK,mBAAkB,EACzD,KAAK,cAAiBA,GAAM,CAC1BA,EAAE,eAAc,EAEK,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAGhF,KAAK,QAAQ,YAAcA,EAAE,OAASA,EAAE,OAExC,KAAK,QAAQ,WAAaA,EAAE,OAASA,EAAE,MAE/C,EAEI,KAAK,QAAQ,iBAAiB,SAAU,KAAK,cAAc,EAC3D,KAAK,eAAe,iBAAiB,YAAa,KAAK,sBAAsB,EAE7E,SAAS,iBAAiB,YAAa,KAAK,qBAAqB,EACjE,SAAS,iBAAiB,UAAW,KAAK,oBAAoB,EAE9D,KAAK,QAAQ,iBAAiB,QAAS,KAAK,cAAe,CAAE,QAAS,EAAK,CAAE,EAE7E,KAAK,WAAa,CAChB,CAAE,GAAI,KAAK,QAAS,MAAO,SAAU,QAAS,KAAK,cAAc,EACjE,CAAE,GAAI,KAAK,eAAgB,MAAO,YAAa,QAAS,KAAK,sBAAsB,EACnF,CAAE,GAAI,SAAU,MAAO,YAAa,QAAS,KAAK,qBAAqB,EACvE,CAAE,GAAI,SAAU,MAAO,UAAW,QAAS,KAAK,oBAAoB,EACpE,CAAE,GAAI,KAAK,QAAS,MAAO,QAAS,QAAS,KAAK,aAAa,CACrE,CACA,CAEE,aAAaA,EAAG,CACd,MAAMktB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAC5EC,EAAeD,EAAe,KAAK,QAAQ,WAAa,KAAK,QAAQ,UAEvE,KAAK,UACP,KAAK,SAAS,CACZ,aAAAC,EACA,aAAAD,EACA,WAAY,KAAK,KAAK,OACtB,WAAY,KAAK,WACjB,SAAU,KAAK,QACvB,CAAO,EAGH,KAAK,kBAAiB,EACtB,KAAK,mBAAkB,EACvB,KAAK,gBAAe,CACxB,CAEE,mBAAoB,CAClB,KAAK,YAAc,GACnB,KAAK,QAAQ,UAAU,IAAI,4BAA4B,EAEnD,KAAK,eACP,aAAa,KAAK,aAAa,EAGjC,KAAK,cAAgB,WAAW,IAAM,CAIpC,GAHA,KAAK,YAAc,GACnB,KAAK,QAAQ,UAAU,OAAO,4BAA4B,EAEtD,KAAK,YAAa,CACpB,MAAMA,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAC5EC,EAAeD,EAAe,KAAK,QAAQ,WAAa,KAAK,QAAQ,UAC3E,KAAK,YAAY,CACf,aAAAC,EACA,aAAAD,EACA,WAAY,KAAK,KAAK,OACtB,WAAY,KAAK,WACjB,SAAU,KAAK,QACzB,CAAS,CACT,CACA,EAAO,GAAG,CACV,CAEE,YAAY/pB,EAAO,CACjB,MAAM+pB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAElF,GAAI,KAAK,iBAAkB,CACzB,MAAMjsB,EAAM,KAAK,KAAKkC,CAAK,EAAE,KAAK,QAAQ,GAAKA,EAC/C,GAAI,KAAK,mBAAmB,IAAIlC,CAAG,EACjC,OAAO,KAAK,mBAAmB,IAAIA,CAAG,CAE9C,CAEI,OAAOisB,EAAe,KAAK,UAAY,KAAK,UAChD,CAEE,kBAAmB,CACjB,MAAME,EAAY,CAAA,EAClB,IAAIC,EAAkB,EAEtB,YAAK,KAAK,QAAQ,CAACzhB,EAAMzI,IAAU,CACjC,MAAMsJ,EAAO,KAAK,YAAYtJ,CAAK,EACnCiqB,EAAU,KAAK,CACb,MAAOC,EACP,IAAKA,EAAkB5gB,EACvB,KAAAA,CACR,CAAO,EACD4gB,GAAmB5gB,CACzB,CAAK,EAEM2gB,CACX,CAEE,cAAe,CACb,GAAI,KAAK,iBACP,OAAO,KAAK,KAAK,OAAO,CAACE,EAAO1hB,EAAMzI,IAC7BmqB,EAAQ,KAAK,YAAYnqB,CAAK,EACpC,CAAC,EAIN,MAAMoqB,EADe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAClD,KAAK,UAAY,KAAK,WACtD,OAAO,KAAK,KAAK,OAASA,CAC9B,CAEE,iBAAiBvO,EAAQ,CACvB,GAAI,KAAK,iBAAkB,CACzB,MAAMoO,EAAY,KAAK,mBACvB,QAAS7mB,EAAI,EAAGA,EAAI6mB,EAAU,OAAQ7mB,IACpC,GAAIyY,GAAUoO,EAAU7mB,CAAC,EAAE,OAASyY,EAASoO,EAAU7mB,CAAC,EAAE,IACxD,OAAOA,EAGX,OAAO,KAAK,KAAK,OAAS,CAChC,CAGI,MAAMgnB,EADe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAClD,KAAK,UAAY,KAAK,WACtD,OAAO,KAAK,MAAMvO,EAASuO,CAAQ,CACvC,CAEE,oBAAqB,CACnB,MAAML,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAC5EC,EAAeD,EAAe,KAAK,QAAQ,WAAa,KAAK,QAAQ,UACrEM,EAAeN,EAAe,KAAK,QAAQ,YAAc,KAAK,QAAQ,aAEtEO,EAAa,KAAK,IAAI,EAAG,KAAK,iBAAiBN,CAAY,EAAI,KAAK,UAAU,EACpF,IAAIO,EAAW,KAAK,IAClB,KAAK,KAAK,OAAS,EACnB,KAAK,iBAAiBP,EAAeK,CAAY,EAAI,KAAK,UAChE,EAEQE,EAAWD,IAAYC,EAAWD,GAEtC,KAAK,WAAaA,EAClB,KAAK,SAAWC,EAEhB,MAAMC,EAAc,KAAK,KAAK,MAAMF,EAAYC,EAAW,CAAC,EAE5D,IAAIE,EAAO,GACPP,EAAkB,EAEtB,GAAI,KAAK,iBAEPA,EADkB,KAAK,mBACKI,CAAU,GAAG,OAAS,MAC7C,CACL,MAAMF,EAAWL,EAAe,KAAK,UAAY,KAAK,WACtDG,EAAkBI,EAAaF,CACrC,CAEII,EAAY,QAAQ,CAAC/hB,EAAMrF,IAAM,CAC/B,MAAMsnB,EAAcJ,EAAalnB,EAC3BtF,EAAM2K,EAAK,KAAK,QAAQ,GAAKiiB,EAC7BC,EAAa,KAAK,cAAgB7sB,EAClCssB,EAAW,KAAK,YAAYM,CAAW,EACvCtD,EAAW8C,EAEbH,EACFU,GAAQ;AAAA;AAAA,0CAE0BE,EAAa,eAAiB,EAAE;AAAA,uDACnBvD,CAAQ,cAAcgD,CAAQ;AAAA,0BAC3DM,CAAW;AAAA,wBACb5sB,CAAG;AAAA;AAAA,cAEb,KAAK,WAAW2K,EAAMiiB,CAAW,CAAC;AAAA;AAAA,UAIxCD,GAAQ;AAAA;AAAA,0CAE0BE,EAAa,eAAiB,EAAE;AAAA,8CAC5BvD,CAAQ,kCAAkCgD,CAAQ;AAAA,0BACtEM,CAAW;AAAA,wBACb5sB,CAAG;AAAA;AAAA,cAEb,KAAK,WAAW2K,EAAMiiB,CAAW,CAAC;AAAA;AAAA,UAK1CR,GAAmBE,CACzB,CAAK,EAED,KAAK,UAAU,UAAYK,EAEvB,KAAK,kBACP,KAAK,qBAAoB,EAG3B,KAAK,UAAU,iBAAiB,wBAAwB,EAAE,QAAQhiB,GAAQ,CACxEA,EAAK,iBAAiB,QAAS,IAAM,KAAK,gBAAgBA,CAAI,CAAC,CACrE,CAAK,CACL,CAEE,sBAAuB,CACrB,GAAI,KAAK,WAAY,OAErB,IAAImiB,EAAa,GACjB,KAAK,UAAU,iBAAiB,wBAAwB,EAAE,QAAQniB,GAAQ,CACxE,MAAMzI,EAAQ,SAASyI,EAAK,QAAQ,KAAK,EACnC3K,EAAM,KAAK,KAAKkC,CAAK,EAAE,KAAK,QAAQ,GAAKA,EACzC6qB,EAAepiB,EAAK,aAEtBoiB,IAAiB,KAAK,YAAY7qB,CAAK,IACzC,KAAK,mBAAmB,IAAIlC,EAAK+sB,CAAY,EAC7CD,EAAa,GAErB,CAAK,EAEGA,IACF,KAAK,WAAa,GAClB,KAAK,OAAM,EACX,KAAK,WAAa,GAExB,CAEE,gBAAgBniB,EAAM,CACpB,MAAMzI,EAAQ,SAASyI,EAAK,QAAQ,KAAK,EACnC3K,EAAM2K,EAAK,QAAQ,IACnBqiB,EAAW,KAAK,KAAK9qB,CAAK,EAE5B,KAAK,aACP,KAAK,YAAY,CAAE,KAAM8qB,EAAU,MAAA9qB,EAAO,IAAAlC,CAAG,CAAE,EAG7C,KAAK,cACP,KAAK,OAAOA,CAAG,CAErB,CAEE,OAAOA,EAAK,CAGV,GAFA,KAAK,YAAcA,EAEf,KAAK,aAAc,CACrB,MAAMkC,EAAQ,KAAK,KAAK,UAAUyI,GAAQA,EAAK,KAAK,QAAQ,IAAM3K,CAAG,EACjEkC,IAAU,IACZ,KAAK,aAAa,CAAE,KAAM,KAAK,KAAKA,CAAK,EAAG,MAAAA,EAAO,IAAAlC,CAAG,CAAE,CAEhE,CAEI,KAAK,mBAAkB,CAC3B,CAEE,iBAAkB,CAChB,MAAMisB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAC5EgB,EAAY,KAAK,eACjBV,EAAeN,EAAe,KAAK,QAAQ,YAAc,KAAK,QAAQ,aACtEC,EAAeD,EAAe,KAAK,QAAQ,WAAa,KAAK,QAAQ,UAE3E,GAAIA,EAAc,CAChB,KAAK,eAAe,MAAM,QAAU,OACpC,MACN,CAEI,MAAMiB,EAAc,KAAK,IAAI,GAAKX,EAAeU,EAAaV,CAAY,EACpEY,EAASZ,EAAeW,EACxBE,EAAYlB,GAAgBe,EAAYV,GAAgB,GAAMY,EAEpE,KAAK,eAAe,MAAM,OAASD,EAAc,KACjD,KAAK,eAAe,MAAM,IAAME,EAAW,IAC/C,CAEE,qBAAqBruB,EAAG,CACtBA,EAAE,eAAc,EAChB,KAAK,WAAa,GAClB,KAAK,WAAaA,EAAE,QACpB,KAAK,aAAe,WAAW,KAAK,eAAe,MAAM,GAAG,GAAK,CACrE,CAEE,oBAAoBA,EAAG,CACrB,GAAI,CAAC,KAAK,WAAY,OAEtB,MAAM0qB,EAAiB,KAAK,QAAQ,aAC9B4D,EAAc,KAAK,eACnBH,EAAc,WAAW,KAAK,eAAe,MAAM,MAAM,GAAKzD,EAC9D0D,EAAS1D,EAAiByD,EAE1BI,EAASvuB,EAAE,QAAU,KAAK,WAChC,IAAIwuB,EAAS,KAAK,aAAeD,EACjCC,EAAS,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAQJ,CAAM,CAAC,EAE7C,KAAK,eAAe,MAAM,IAAMI,EAAS,KAEzC,MAAMC,EAAaD,EAASJ,GAAWE,EAAc5D,GAAkB,GACvE,KAAK,QAAQ,UAAY+D,CAC7B,CAEE,oBAAqB,CACnB,KAAK,WAAa,EACtB,CAEE,QAAS,CACP,MAAMvB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAC5EgB,EAAY,KAAK,eAEnBhB,GACF,KAAK,UAAU,MAAM,MAAQgB,EAAY,KACzC,KAAK,UAAU,MAAM,OAAS,SAE9B,KAAK,UAAU,MAAM,OAASA,EAAY,KAC1C,KAAK,UAAU,MAAM,MAAQ,QAG/B,KAAK,mBAAkB,EACvB,KAAK,gBAAe,CACxB,CAEE,QAAQpuB,EAAM,CACZ,KAAK,KAAOA,EACR,KAAK,kBACP,KAAK,mBAAmB,QAE1B,KAAK,OAAM,CACf,CAEE,QAAQ8L,EAAM,CACZ,KAAK,KAAK,KAAKA,CAAI,EACnB,KAAK,OAAM,CACf,CAEE,WAAWzI,EAAO,CAChB,KAAK,KAAK,OAAOA,EAAO,CAAC,EACrB,KAAK,kBACP,KAAK,mBAAmB,QAE1B,KAAK,OAAM,CACf,CAEE,WAAWA,EAAOyI,EAAM,CACtB,KAAK,KAAK,OAAOzI,EAAO,EAAGyI,CAAI,EAC3B,KAAK,kBACP,KAAK,mBAAmB,QAE1B,KAAK,OAAM,CACf,CAEE,SAASzI,EAAOurB,EAAW,SAAU,CACnC,MAAMxB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAElF,IAAIC,EAAe,EACnB,GAAI,KAAK,iBAEPA,EADkB,KAAK,mBACEhqB,CAAK,GAAG,OAAS,MACrC,CACL,MAAMoqB,EAAWL,EAAe,KAAK,UAAY,KAAK,WACtDC,EAAehqB,EAAQoqB,CAC7B,CAEQL,EACF,KAAK,QAAQ,SAAS,CAAE,KAAMC,EAAc,SAAAuB,CAAQ,CAAE,EAEtD,KAAK,QAAQ,SAAS,CAAE,IAAKvB,EAAc,SAAAuB,CAAQ,CAAE,CAE3D,CAEE,YAAYztB,EAAKytB,EAAW,SAAU,CACpC,MAAMvrB,EAAQ,KAAK,KAAK,UAAUyI,GAAQA,EAAK,KAAK,QAAQ,IAAM3K,CAAG,EACjEkC,IAAU,IACZ,KAAK,SAASA,EAAOurB,CAAQ,CAEnC,CAEE,YAAYA,EAAW,SAAU,CAC/B,MAAMxB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAClF,KAAK,QAAQ,SAAS,CAAE,CAACA,EAAe,OAAS,KAAK,EAAG,EAAG,SAAAwB,CAAQ,CAAE,CAC1E,CAEE,eAAeA,EAAW,SAAU,CAClC,MAAMxB,EAAe,KAAK,QAAQ,UAAU,SAAS,6BAA6B,EAC5EgB,EAAY,KAAK,eACjBV,EAAeN,EAAe,KAAK,QAAQ,YAAc,KAAK,QAAQ,aAC5E,KAAK,QAAQ,SAAS,CAAE,CAACA,EAAe,OAAS,KAAK,EAAGgB,EAAYV,EAAc,SAAAkB,CAAQ,CAAE,CACjG,CAEE,iBAAkB,CAChB,OAAO,KAAK,KAAK,MAAM,KAAK,WAAY,KAAK,SAAW,CAAC,EAAE,IAAI,CAAC9iB,EAAMrF,KAAO,CAC3E,KAAAqF,EACA,MAAO,KAAK,WAAarF,EACzB,IAAKqF,EAAK,KAAK,QAAQ,GAAK,KAAK,WAAarF,GAC9C,CACN,CAEE,aAAatF,EAAK,CAChB,OAAO,KAAK,KAAK,UAAU2K,GAAQA,EAAK,KAAK,QAAQ,IAAM3K,CAAG,CAClE,CAEE,QAAQA,EAAK,CACX,MAAMkC,EAAQ,KAAK,aAAalC,CAAG,EACnC,OAAOkC,IAAU,GAAK,KAAK,KAAKA,CAAK,EAAI,IAC7C,CAEE,cAAe,CACb,KAAK,mBAAmB,QACxB,KAAK,OAAM,CACf,CAEE,SAAU,CACJ,KAAK,eACP,aAAa,KAAK,aAAa,EAGjC,KAAK,YAAY,QAAQ,CAAC,CAAE,GAAAsb,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CACnD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CAC3C,CAAK,EAED,KAAK,KAAO,GACZ,KAAK,mBAAmB,QACxB,KAAK,UAAU,UAAY,GAE3B,KAAK,WAAa,KAClB,KAAK,eAAiB,KACtB,KAAK,uBAAyB,KAC9B,KAAK,sBAAwB,KAC7B,KAAK,qBAAuB,KAC5B,KAAK,cAAgB,KACrB,KAAK,UAAY,KACjB,KAAK,eAAiB,KACtB,KAAK,QAAU,IACnB,EAGA,SAAS4uB,EAA4BC,EAAQ,IAAM,CACjD,MAAM9uB,EAAO,CAAA,EACP+uB,EAAS,CAAC,WAAY,QAAS,QAAS,SAAU,UAAW,cAAe,eAAgB,MAAM,EAExG,QAAStoB,EAAI,EAAGA,GAAKqoB,EAAOroB,IAAK,CAC/B,MAAMuoB,EAAa,KAAK,MAAM,KAAK,SAAWD,EAAO,MAAM,EACrDE,EAAY,KAAK,MAAM,KAAK,OAAM,EAAK,GAAK,EAElDjvB,EAAK,KAAK,CACR,GAAIyG,EACJ,MAAO,GAAGsoB,EAAOC,CAAU,CAAC,IAAIC,CAAS,GACzC,SAAU,iBAAiB,KAAK,MAAM,KAAK,OAAM,EAAK,EAAE,CAAC,YACzD,KAAMF,EAAOC,CAAU,EAAE,YAAW,CAC1C,CAAK,CACL,CAEE,OAAOhvB,CACT,CAEA,SAASkvB,EAAkBrnB,EAAUpF,EAAU,GAAI,CACjD,MAAMlD,EAAU,SAAS,cAAcsI,CAAQ,EAC/C,GAAItI,EAAS,CACX,MAAMS,EAAOyC,EAAQ,MAAQosB,EAA4BpsB,EAAQ,OAAS,GAAI,EAC9E,OAAO,IAAI0qB,EAAY5tB,EAAS,CAC9B,KAAMS,EACN,GAAGyC,CACT,CAAK,CACL,CACE,OAAO,IACT,CAEA,SAAS0sB,EAAgB5vB,EAAS,CAChC,GAAIA,EAAQ,oBAAqB,OAEjC,MAAMyqB,EAAWzqB,EAAQ,aAAa,mBAAmB,EACzD,IAAIS,EAAO,CAAA,EAEX,GAAIgqB,EACF,GAAI,CACFhqB,EAAO,KAAK,MAAMgqB,CAAQ,CAChC,MAAgB,CACVhqB,EAAO6uB,EAA4B,GAAI,CAC7C,MAEI7uB,EAAO6uB,EAA4B,GAAI,EAGzC,MAAM3sB,EAAW,IAAIirB,EAAY5tB,EAAS,CACxC,KAAMS,EACN,YAAckqB,GAAS,CAAA,EACvB,aAAeA,GAAS,CAAA,CAC5B,CAAG,EAED3qB,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAChC,CAEA,SAAS6vB,EAAmB7vB,EAAS,CACnC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEA,SAAS8vB,GAAmB,CAC1B,SAAS,iBAAiB,kBAAkB,EAAE,QAAQ9vB,GAAW,CAC/D4vB,EAAgB5vB,CAAO,CAC3B,CAAG,CACH,CAEqC+B,EAAO,QAC1CA,EAAA,QAAiB,CAAE,YAAA6rB,EAAa,iBAAAkC,EAAkB,gBAAAF,EAAiB,mBAAAC,EAAoB,kBAAAF,EAAmB,4BAAAL,IAE1G,OAAO,gBAAkBM,EACzB,OAAO,mBAAqBC,GAG1B,OAAO,mBACT,OAAO,kBAAkB,SAAS,eAAgBD,EAAiBC,CAAkB,wBC/kBvF,IAAAE,GAAA,KAAqB,CACnB,YAAY7sB,EAAU,GAAI,CACxB,KAAK,QAAUA,EAAQ,SAAW,GAClC,KAAK,MAAQ,KACb,KAAK,OAAS,GACd,KAAK,UAAY,UACjB,KAAK,kBAAoB,UACzB,KAAK,eAAiB,GACtB,KAAK,eAAiB,EACxB,CAEA,MAAO,CACL,GAAK,KAAK,QACV,GAAI,CACF,KAAK,mBAAkB,EACvB,KAAK,YAAW,EAChB,KAAK,wBAAuB,CAC9B,OAASnC,EAAO,CACd,QAAQ,MAAM,iBAAkBA,CAAK,CACvC,CACF,CAEA,oBAAqB,CACnB,MAAMivB,EAAS,SAAS,cAAc,QAAQ,EAC9CA,EAAO,UAAY,0BACnBA,EAAO,YAAc,MACrBA,EAAO,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBvBA,EAAO,iBAAiB,QAAS,IAAM,KAAK,YAAW,CAAE,EACzD,SAAS,KAAK,YAAYA,CAAM,EAChC,KAAK,aAAeA,CACtB,CAEA,aAAc,CACZ,MAAMC,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,yBAClBA,EAAM,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBtBA,EAAM,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAkBZ,KAAK,kBAAkB,SAAS,CAAC;AAAA;AAAA,MAIvC,SAAS,KAAK,YAAYA,CAAK,EAC/B,KAAK,MAAQA,EAEbA,EAAM,cAAc,yBAAyB,EAAE,iBAAiB,QAAS,IAAM,KAAK,YAAW,CAAE,EACjGA,EAAM,iBAAiB,uBAAuB,EAAE,QAAQC,GAAO,CAC7DA,EAAI,iBAAiB,QAAS,IAAM,KAAK,UAAUA,EAAI,QAAQ,GAAG,CAAC,CACrE,CAAC,EACD,KAAK,qBAAoB,EACzB,KAAK,cAAa,EAClB,KAAK,aAAY,CACnB,CAEA,UAAUC,EAAS,CACjB,KAAK,UAAYA,EAEjB,KAAK,MAAM,iBAAiB,uBAAuB,EAAE,QAAQD,GAAO,CAClEA,EAAI,UAAU,OAAO,SAAUA,EAAI,QAAQ,MAAQC,CAAO,CAC5D,CAAC,EAED,MAAMC,EAAiB,KAAK,MAAM,cAAc,mBAAmB,EAC7DC,EAAiB,KAAK,MAAM,cAAc,mBAAmB,EAE/DF,IAAY,WACdC,EAAe,MAAM,QAAU,OAC/BC,EAAe,MAAM,QAAU,OAC/B,KAAK,qBAAoB,IAEzBD,EAAe,MAAM,QAAU,OAC/BC,EAAe,MAAM,QAAU,OAC/B,KAAK,qBAAoB,EAE7B,CAEA,sBAAuB,CACrB,MAAM1P,EAAU,KAAK,MAAM,cAAc,2BAA2B,EAChEA,IACFA,EAAQ,UAAY,KAAK,kBAAkB,KAAK,iBAAiB,EAErE,CAEA,sBAAuB,CACrB,MAAMA,EAAU,KAAK,MAAM,cAAc,2BAA2B,EACpE,GAAI,CAACA,EAAS,OAEd,GAAI,KAAK,eAAe,SAAW,EAAG,CACpCA,EAAQ,UAAY,2EACpB,MACF,CAEA,IAAI4N,EAAO,GACX,KAAK,eAAe,QAAQ,CAAC+B,EAAKxsB,IAAU,CAC1C,MAAMysB,EAAcD,EAAI,QAAU,KAAOA,EAAI,OAAS,IAAM,UACzCA,EAAI,QAAU,IAAM,QAAU,UAC3CvJ,EAAWuJ,EAAI,SAAW,GAAGA,EAAI,QAAQ,KAAO,IAEtD/B,GAAQ;AAAA,iEACmDzqB,CAAK;AAAA;AAAA,4DAEVwsB,EAAI,MAAM;AAAA,yDACbA,EAAI,GAAG;AAAA,2DACLC,CAAW,KAAKD,EAAI,MAAM;AAAA,8DACvBvJ,CAAQ;AAAA;AAAA;AAAA,cAGxDuJ,EAAI,OAAS,6EAA6E,KAAK,gBAAgB,KAAK,UAAUA,EAAI,OAAQ,KAAM,CAAC,EAAG,GAAI,CAAC,eAAiB,EAAE;AAAA,cAC5KA,EAAI,YAAc,mFAAmF,KAAK,gBAAgBA,EAAI,YAAa,GAAI,CAAC,eAAiB,EAAE;AAAA,cACnKA,EAAI,SAAW,+EAA+E,KAAK,gBAAgBA,EAAI,SAAU,IAAI,CAAC,eAAiB,EAAE;AAAA;AAAA;AAAA,OAInK,CAAC,EAED3P,EAAQ,UAAY4N,EAEpB5N,EAAQ,iBAAiB,gCAAgC,EAAE,QAAQpU,GAAQ,CACzEA,EAAK,iBAAiB,QAAS,IAAM,CACnC,MAAMikB,EAAUjkB,EAAK,cAAc,mCAAmC,EACtEikB,EAAQ,MAAM,QAAUA,EAAQ,MAAM,UAAY,OAAS,QAAU,MACvE,CAAC,CACH,CAAC,EAED,MAAMC,EAAW,KAAK,MAAM,cAAc,uBAAuB,EAC7DA,GACFA,EAAS,iBAAiB,QAAU9vB,GAAM,CACxCA,EAAE,gBAAe,EACjB,KAAK,oBAAmB,CAC1B,CAAC,CAEL,CAEA,qBAAsB,CACpB,KAAK,eAAiB,GACtB,KAAK,qBAAoB,CAC3B,CAEA,gBAAgBggB,EAASjV,EAAW,CAClC,GAAI,CAACiV,EAAS,MAAO,IACrB,MAAMrV,EAAM,OAAOqV,GAAY,SAAWA,EAAU,KAAK,UAAUA,CAAO,EAC1E,OAAIrV,EAAI,QAAUI,EAAkBJ,EAC7BA,EAAI,UAAU,EAAGI,CAAS,EAAI,mBAAmBJ,EAAI,MAAM,SACpE,CAEA,yBAA0B,CACxB,MAAMolB,EAAW,KAEXC,EAAgB,OAAO,MAC7B,OAAO,MAAQ,eAAezsB,EAAKhB,EAAU,CAAA,EAAI,CAC/C,MAAM2G,EAAY,KAAK,MACjB+mB,EAAY,KAAK,IAAG,EAAK,KAAK,OAAM,EAE1C,IAAIC,EAAc,KAClB,GAAI3tB,EAAQ,KACV,GAAI,OAAOA,EAAQ,MAAS,SAC1B2tB,EAAc3tB,EAAQ,aACbA,EAAQ,gBAAgB,SACjC,GAAI,CACF2tB,EAAc,KAAK,UAAU,OAAO,YAAY3tB,EAAQ,IAAI,CAAC,CAC/D,MAAQ,CAAC,KAET,IAAI,CACF2tB,EAAc,KAAK,UAAU3tB,EAAQ,IAAI,CAC3C,MAAQ,CAAC,CAIb,IAAIW,EAAS,KACb,GAAI,CACF,MAAMgC,EAAS,IAAI,IAAI,OAAO3B,GAAQ,SAAWA,EAAMA,EAAI,IAAI,EAC3D2B,EAAO,SACThC,EAAS,OAAO,YAAYgC,EAAO,YAAY,EAEnD,MAAQ,CAAC,CAET,MAAMghB,EAAQ,CACZ,GAAI+J,EACJ,OAAQ1tB,EAAQ,QAAU,MAC1B,IAAK,OAAOgB,GAAQ,SAAWA,EAAMA,EAAI,KACzC,OAAAL,EACA,YAAAgtB,EACA,OAAQ,EACR,SAAU,KACV,SAAU,IAClB,EAEMH,EAAS,WAAW7J,CAAK,EAEzB,GAAI,CACF,MAAM9gB,EAAW,MAAM4qB,EAAc,MAAM,KAAM,SAAS,EAE1D9J,EAAM,OAAS9gB,EAAS,OACxB8gB,EAAM,SAAW,KAAK,IAAG,EAAKhd,EAE9B,GAAI,CAEF,MAAMqO,EAAO,MADCnS,EAAS,QACE,OACzB,GAAI,CACF8gB,EAAM,SAAW,KAAK,MAAM3O,CAAI,CAClC,MAAQ,CACN2O,EAAM,SAAW3O,CACnB,CACF,MAAQ,CAAC,CAET,OAAAwY,EAAS,cAAc7J,CAAK,EAErB9gB,CACT,OAAShF,EAAO,CACd,MAAA8lB,EAAM,OAAS,GACfA,EAAM,SAAW9lB,EAAM,QACvB8lB,EAAM,SAAW,KAAK,IAAG,EAAKhd,EAC9B6mB,EAAS,cAAc7J,CAAK,EACtB9lB,CACR,CACF,EAEA,MAAM+vB,EAAe,eAAe,UAAU,KAC9C,eAAe,UAAU,KAAO,SAAS1rB,EAAQlB,EAAK,CACpD,KAAK,gBAAkB,CACrB,OAAAkB,EACA,IAAAlB,EACA,OAAQ,KACR,YAAa,KACb,OAAQ,EACR,SAAU,KACV,UAAW,KAAK,IAAG,CAC3B,EAEM,GAAI,CACF,MAAM2B,EAAS,IAAI,IAAI3B,CAAG,EACtB2B,EAAO,SACT,KAAK,gBAAgB,OAAS,OAAO,YAAYA,EAAO,YAAY,EAExE,MAAQ,CAAC,CAETirB,EAAa,MAAM,KAAM,SAAS,CACpC,EAEA,MAAMC,EAAe,eAAe,UAAU,KAC9C,eAAe,UAAU,KAAO,SAASlI,EAAM,CAC7C,GAAI,KAAK,gBAAiB,CACxB,GAAIA,GACF,GAAI,OAAOA,GAAS,SAClB,KAAK,gBAAgB,YAAcA,UAC1BA,aAAgB,SACzB,GAAI,CACF,KAAK,gBAAgB,YAAc,KAAK,UAAU,OAAO,YAAYA,CAAI,CAAC,CAC5E,MAAQ,CAAC,EAIb,MAAMhC,EAAQ,CAAE,GAAG,KAAK,eAAe,EACvC6J,EAAS,WAAW7J,CAAK,EACzB,KAAK,cAAgBA,CACvB,CAEAkK,EAAa,MAAM,KAAM,SAAS,CACpC,EAEA,MAAMC,EAA6B,eAAe,UAAU,mBAC5D,eAAe,UAAU,mBAAqB,UAAW,CACvD,GAAI,KAAK,eAAiB,KAAK,aAAe,EAAG,CAC/C,KAAK,cAAc,OAAS,KAAK,OACjC,KAAK,cAAc,SAAW,KAAK,IAAG,EAAK,KAAK,gBAAgB,UAEhE,GAAI,CACF,MAAMC,EAAe,KAAK,aAC1B,GAAI,CACF,KAAK,cAAc,SAAW,KAAK,MAAMA,CAAY,CACvD,MAAQ,CACN,KAAK,cAAc,SAAWA,CAChC,CACF,MAAQ,CAAC,CAETP,EAAS,cAAc,KAAK,aAAa,CAC3C,CAEI,OAAOM,GAA+B,YACxCA,EAA2B,MAAM,KAAM,SAAS,CAEpD,CACF,CAEA,WAAWnK,EAAO,CAChB,KAAK,eAAe,QAAQA,CAAK,EAC7B,KAAK,eAAe,OAAS,KAAK,gBACpC,KAAK,eAAe,MAGlB,KAAK,QAAU,KAAK,YAAc,WACpC,KAAK,qBAAoB,CAE7B,CAEA,cAAcA,EAAO,CACnB,MAAM/iB,EAAQ,KAAK,eAAe,UAAU,GAAK,EAAE,KAAO+iB,EAAM,IAC7D,EAAE,MAAQA,EAAM,KAAO,EAAE,SAAWA,EAAM,QAAU,CAAC,EAAE,MAAO,EAC7D/iB,IAAU,KACZ,KAAK,eAAeA,CAAK,EAAI+iB,EAEzB,KAAK,QAAU,KAAK,YAAc,WACpC,KAAK,qBAAoB,EAG/B,CAEA,sBAAuB,CACrB,MAAM6J,EAAW,KAEjB,OAAO,iBAAiB,UAAY/vB,GAAM,CACxC,GAAI+vB,EAAS,QAAUA,EAAS,YAAc,UAAW,CACvD,MAAM/P,EAAU+P,EAAS,OAAO,cAAc,2BAA2B,EACzE,GAAI/P,EAAS,CACX,MAAM/Y,EAAOjH,EAAE,cAAgB,aAAe,eAAiB,iBAC/D+vB,EAAS,kBAAoB9oB,EAC7B8oB,EAAS,kBAAiB,EAC1B/P,EAAQ,UAAY+P,EAAS,kBAAkB9oB,CAAI,CACrD,CACF,CACF,CAAC,EAED,MAAMspB,EAAkB,QAAQ,UAAU,QAC1C,QAAQ,UAAU,QAAU,SAAStvB,EAAKxB,EAAO,CAC/C,MAAMkW,EAAW,KAAK,QAAQ1U,CAAG,EACjCsvB,EAAgB,KAAK,KAAMtvB,EAAKxB,CAAK,EACrC,MAAMif,EAAQ,IAAI,aAAa,UAAW,CACxC,IAAAzd,EACA,SAAA0U,EACA,SAAUlW,EACV,IAAK,OAAO,SAAS,KACrB,YAAa,IACrB,CAAO,EACD,OAAO,cAAcif,CAAK,CAC5B,EAEA,MAAM8R,EAAqB,QAAQ,UAAU,WAC7C,QAAQ,UAAU,WAAa,SAASvvB,EAAK,CAC3C,MAAM0U,EAAW,KAAK,QAAQ1U,CAAG,EACjCuvB,EAAmB,KAAK,KAAMvvB,CAAG,EACjC,MAAMyd,EAAQ,IAAI,aAAa,UAAW,CACxC,IAAAzd,EACA,SAAA0U,EACA,SAAU,KACV,IAAK,OAAO,SAAS,KACrB,YAAa,IACrB,CAAO,EACD,OAAO,cAAc+I,CAAK,CAC5B,CACF,CAEA,cAAe,CACb,MAAM+R,EAAS,SAAS,cAAc,OAAO,EAC7CA,EAAO,YAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAyCrB,SAAS,KAAK,YAAYA,CAAM,CAClC,CAEA,eAAgB,CACd,MAAMtN,EAAS,KAAK,MAAM,cAAc,0BAA0B,EAClE,IAAIuN,EAAa,GACbC,EAAQC,EAAQC,EAAWC,EAE/B,KAAK,sBAAyB9wB,GAAM,CAC9BA,EAAE,OAAO,QAAQ,yBAAyB,IAC9C0wB,EAAa,GACbC,EAAS3wB,EAAE,QACX4wB,EAAS5wB,EAAE,QACX6wB,EAAY,KAAK,MAAM,WACvBC,EAAW,KAAK,MAAM,UACxB,EAEA,KAAK,sBAAyB9wB,GAAM,CAClC,GAAI,CAAC0wB,EAAY,OACjB,MAAMK,EAAK/wB,EAAE,QAAU2wB,EACjBK,EAAKhxB,EAAE,QAAU4wB,EACvB,KAAK,MAAM,MAAM,KAAO,GAAGC,EAAYE,CAAE,KACzC,KAAK,MAAM,MAAM,MAAQ,OACzB,KAAK,MAAM,MAAM,IAAM,GAAG,KAAK,IAAI,EAAGD,EAAWE,CAAE,CAAC,IACtD,EAEA,KAAK,oBAAsB,IAAM,CAAEN,EAAa,EAAO,EAEvDvN,EAAO,iBAAiB,YAAa,KAAK,qBAAqB,EAC/D,SAAS,iBAAiB,YAAa,KAAK,qBAAqB,EACjE,SAAS,iBAAiB,UAAW,KAAK,mBAAmB,CAC/D,CAEA,SAAU,CACR,MAAMA,EAAS,KAAK,MAAM,cAAc,0BAA0B,EAE9DA,GAAU,KAAK,uBACjBA,EAAO,oBAAoB,YAAa,KAAK,qBAAqB,EAGhE,KAAK,uBACP,SAAS,oBAAoB,YAAa,KAAK,qBAAqB,EAGlE,KAAK,qBACP,SAAS,oBAAoB,UAAW,KAAK,mBAAmB,EAG9D,KAAK,OAAS,KAAK,MAAM,YAC3B,KAAK,MAAM,WAAW,YAAY,KAAK,KAAK,EAG9C,KAAK,sBAAwB,KAC7B,KAAK,sBAAwB,KAC7B,KAAK,oBAAsB,KAC3B,KAAK,MAAQ,IACf,CAEA,aAAc,CACZ,KAAK,OAAS,CAAC,KAAK,OACpB,KAAK,MAAM,MAAM,QAAU,KAAK,OAAS,OAAS,OAE9C,KAAK,QAAU,KAAK,YAAc,WACpC,KAAK,qBAAoB,CAE7B,CAEA,mBAAoB,CAClB,KAAK,MAAM,iBAAiB,2BAA2B,EAAE,QAAQoM,GAAO,CACtEA,EAAI,UAAU,OAAO,SAAUA,EAAI,QAAQ,UAAY,KAAK,iBAAiB,CAC/E,CAAC,CACH,CAEA,kBAAkBtoB,EAAM,CACtB,IAAI6E,EAAQ,CAAA,EAEZ,GAAI,CACF,GAAI7E,IAAS,UACX6E,EAAQ,SAAS,OAAO,MAAM,GAAG,EAAE,IAAIlB,GAAKA,EAAE,KAAI,CAAE,EAAE,OAAOA,GAAKA,CAAC,EAAE,IAAIA,GAAK,CAC5E,KAAM,CAAC3J,EAAK,GAAGgwB,CAAU,EAAIrmB,EAAE,MAAM,GAAG,EACxC,MAAO,CAAE,IAAA3J,EAAK,MAAOgwB,EAAW,KAAK,GAAG,EAC1C,CAAC,UACQhqB,IAAS,eAClB,QAASV,EAAI,EAAGA,EAAI,aAAa,OAAQA,IACvCuF,EAAM,KAAK,CAAE,IAAK,aAAa,IAAIvF,CAAC,EAAG,MAAO,aAAa,QAAQ,aAAa,IAAIA,CAAC,CAAC,CAAC,CAAE,UAElFU,IAAS,iBAClB,QAASV,EAAI,EAAGA,EAAI,eAAe,OAAQA,IACzCuF,EAAM,KAAK,CAAE,IAAK,eAAe,IAAIvF,CAAC,EAAG,MAAO,eAAe,QAAQ,eAAe,IAAIA,CAAC,CAAC,CAAC,CAAE,CAGrG,OAASvG,EAAG,CACV,eAAQ,MAAM,yBAA0BA,CAAC,EAClC,mEACT,CAEA,GAAI8L,EAAM,SAAW,EAAG,MAAO,sDAE/B,IAAI8hB,EAAO,GACX,OAAA9hB,EAAM,QAAQF,GAAQ,CACpB,IAAIslB,EAAetlB,EAAK,MACxB,GAAIslB,GAAgBA,EAAa,OAAS,GAAKA,EAAa,OAAS,IACnE,GAAI,CACF,MAAMvZ,EAAS,KAAK,MAAMuZ,CAAY,EACtCA,EAAe,KAAK,UAAUvZ,EAAQ,KAAM,CAAC,CAC/C,MAAQ,CAAC,MACAuZ,GAAgBA,EAAa,QAAU,MAChDA,EAAeA,EAAa,UAAU,EAAG,GAAG,EAAI,mBAAqBA,EAAa,OAAS,WAE7FtD,GAAQ,2FAA2FhiB,EAAK,GAAG,4DAA4DslB,CAAY,cACrL,CAAC,EAEMtD,CACT,CAEA,mBAAmB5tB,EAAG,CACpB,MAAMyV,EAASzV,EAAE,OACjB,GAAIyV,EAAO,UAAU,SAAS,0BAA0B,EAAG,CACzDzV,EAAE,gBAAe,EACjB,MAAMiH,EAAOwO,EAAO,QAAQ,QAC5B,GAAIxO,EAAM,CACR,KAAK,kBAAoBA,EACzB,KAAK,kBAAiB,EACtB,MAAM+Y,EAAU,KAAK,MAAM,cAAc,2BAA2B,EAChEA,IACFA,EAAQ,UAAY,KAAK,kBAAkB/Y,CAAI,EAEnD,CACF,CACF,CACF,EAEA,SAASkqB,IAAe,CACtB,GAAI,CACF,MAAMpW,EAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM,GAC5CA,EAAU,IAAI,KAAK,GAAKA,EAAU,IAAI,OAAO,KAG3D,OAAO,eAAiB,IAAIqW,GAAe,CAAE,QAAS,EAAI,CAAE,EAC5D,OAAO,eAAe,OAEtB,OAAO,iBAAiB,QAAU,GAAM,CAClC,OAAO,gBAAkB,OAAO,eAAe,oBACjD,OAAO,eAAe,mBAAmB,CAAC,CAE9C,CAAC,EAEL,OAAShxB,EAAO,CACd,QAAQ,MAAM,sCAAuCA,CAAK,CAC5D,CACF,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB+wB,EAAY,EAE1DA,KAGF,OAAO,eAAiBC,+CCjlBvB,SAAUC,EAAQ,CACjB,MAAMC,EAAQ,iLAERC,EAAQ,CAEZ,MAAe,mIACf,UAAe,uKACf,MAAe,0FACf,OAAe,4DACf,OAAe,6CACf,OAAe,kCACf,KAAe,yOACf,QAAe,2KACf,KAAe,qHACf,MAAe,sMACf,SAAe,iJAEf,KAAe,uEACf,SAAe,kGACf,QAAe,iJACf,SAAe,iJACf,SAAe,ykBACf,QAAe,qVACf,KAAe,+EACf,MAAe,yCACf,EAAe,6EACf,OAAe,8QACf,iBAAiB,sEAGjB,eAAe,kJACf,KAAe,mSACf,cAAe,qGACf,OAAe,yDACf,MAAe,uCACf,cAAe,8EACf,iBAAkB,2EAClB,gBAAgB,sCAChB,eAAe,sCAEf,eAAe,sEACf,eAAe,kHACf,iBAAiB,kHACjB,cAAe,iHACf,WAAe,4GAEf,MAAe,kHACf,KAAe,iHAEf,KAAe,gFACf,KAAe,qFACf,MAAe,gKACf,IAAe,4KACf,IAAe,6DACf,KAAe,2DACf,IAAe,8WACf,IAAe,+LACf,IAAe,4JACf,KAAe,yFACf,WAAe,6EACf,aAAe,uCACf,aAAe,6EACf,IAAe,0HACf,GAAe,sFACf,KAAe,wJACf,eAAiB,iFACjB,gBAAiB,mFACjB,eAAiB,mFAMjB,IAAe,oKACf,IAAe,kYACf,cAAe,+GACf,WAAe,uNAEf,OAAuB,gJACvB,iBAAuB,4EACvB,YAAuB,8IACvB,cAAuB,kKACvB,KAAuB,wNACvB,sBAAuB,oHACvB,cAAuB,4HAIvB,iBAAuB,yJACvB,eAAuB,uJACvB,aAAe,8EACf,KAAe,qHAEf,SAAe,iKACf,KAAe,6DACf,MAAe,4JACf,KAAe,kEAEf,MAAe,4FAEf,WAAe,uKACf,OAAe,kCACf,OAAe,oFACf,OAAe,qHACf,SAAe,4EACf,MAAe,gJACf,KAAe,yCACf,MAAe,sFACf,KAAe,iIACf,KAAe,iFAEf,IAAe,0FACf,KAAe,gFACf,MAAe,0EACf,KAAe,8EACf,SAAe,2JACf,MAAe,uEACf,OAAe,2DACf,KAAe,iDACf,KAAe,yHACf,OAAe,+FACf,UAAe,kIACf,KAAe,oHAEf,OAAkB,sGAClB,IAAkB,0KAClB,cAAkB,gFAClB,gBAAkB,iFAClB,QAAkB,yHAElB,KAAkB,mGAClB,IAAkB,6XAClB,KAAkB,0EAElB,MAAkB,8fACtB,EAEE,SAASC,EAAIhyB,EAAMiN,EAAO,GAAIglB,EAAU,YAAa,CACnD,MAAM5uB,EAAO0uB,EAAM/xB,CAAI,EACvB,OAAKqD,EAKE,QAJOyuB,EACX,QAAQ,aAAc,UAAU7kB,CAAI,GAAG,EACvC,QAAQ,cAAe,WAAWA,CAAI,GAAG,EACzC,QAAQ,sBAAuB,YAAYglB,CAAO,GAAG,CACpC,IAAI5uB,CAAI,SALV,EAMtB,CAEE,SAAS6uB,EAAOhwB,EAAO,SAAU,CAC/BA,EAAK,iBAAiB,aAAa,EAAE,QAAQ+c,GAAM,CACjD,MAAMjf,EAAOif,EAAG,aAAa,WAAW,EAClChS,EAAO,CAACgS,EAAG,aAAa,WAAW,GAAK,GACxCkT,EAAOlT,EAAG,aAAa,cAAc,GAAK,YAChDA,EAAG,UAAY+S,EAAIhyB,EAAMiN,EAAMklB,CAAE,EACjClT,EAAG,UAAU,IAAI,MAAM,CAC7B,CAAK,CACL,CAEE4S,EAAO,MAAQ,CAAE,IAAAG,EAAK,OAAAE,EAAQ,MAAAH,CAAK,EAC/B,SAAS,aAAe,UAAWG,EAAM,EACxC,SAAS,iBAAiB,mBAAoB,IAAMA,EAAM,CAAE,CACnE,EAAG,OAAO,OAAW,IAAc,OAAS,UAAU,6ECpKtD,MAAME,CAAU,CACd,YAAYvyB,EAAS,CACnB,KAAK,QAAUA,EACf,KAAK,QAAUA,EAAQ,cAAc,iDAAiD,EACtF,KAAK,UAAYA,EAAQ,cAAc,mDAAmD,EAC1F,KAAK,UAAYA,EAAQ,cAAc,mDAAmD,EAE1F,KAAK,QAAU,KAAK,eACpB,KAAK,SAAW,KAEhB,KAAK,KAAI,CACb,CAEE,cAAe,CACb,MAAMwyB,EAAc,KAAK,QAAQ,aAAa,eAAe,EAC7D,GAAIA,EACF,OAAO,IAAI,KAAKA,CAAW,EAAE,QAAO,EAGtC,MAAMC,EAAY,SAAS,KAAK,QAAQ,aAAa,YAAY,CAAC,GAAK,EACjEC,EAAc,SAAS,KAAK,QAAQ,aAAa,cAAc,CAAC,GAAK,EACrEC,EAAc,SAAS,KAAK,QAAQ,aAAa,cAAc,CAAC,GAAK,EAE3E,OAAO,IAAI,KAAI,EAAG,QAAO,GAAMF,EAAY,KAAOC,EAAc,GAAKC,GAAe,GACxF,CAEE,MAAO,CACL,KAAK,OAAM,EACX,KAAK,MAAK,CACd,CAEE,OAAQ,CACF,KAAK,UACP,cAAc,KAAK,QAAQ,EAE7B,KAAK,SAAW,YAAY,IAAM,CAChC,KAAK,OAAM,CACjB,EAAO,GAAI,CACX,CAEE,MAAO,CACD,KAAK,WACP,cAAc,KAAK,QAAQ,EAC3B,KAAK,SAAW,KAEtB,CAEE,OAAQ,CACN,KAAK,KAAI,EACT,KAAK,QAAU,KAAK,eACpB,KAAK,KAAI,CACb,CAEE,QAAS,CACP,MAAM5jB,EAAM,IAAI,KAAI,EAAG,QAAO,EACxB6jB,EAAW,KAAK,QAAU7jB,EAEhC,GAAI6jB,GAAY,EAAG,CACjB,KAAK,KAAI,EACT,KAAK,YAAY,EAAG,EAAG,CAAC,EACxB,KAAK,iBAAgB,EACrB,MACN,CAEI,MAAMvjB,EAAQ,KAAK,MAAOujB,GAAY,IAAO,GAAK,GAAK,KAAQ,IAAO,GAAK,GAAG,EACxEtjB,EAAU,KAAK,MAAOsjB,GAAY,IAAO,GAAK,KAAQ,IAAO,GAAG,EAChErjB,EAAU,KAAK,MAAOqjB,GAAY,IAAO,IAAO,GAAI,EAE1D,KAAK,YAAYvjB,EAAOC,EAASC,CAAO,CAC5C,CAEE,YAAYF,EAAOC,EAASC,EAAS,CAC/B,KAAK,UACP,KAAK,QAAQ,YAAc,OAAOF,CAAK,EAAE,SAAS,EAAG,GAAG,GAEtD,KAAK,YACP,KAAK,UAAU,YAAc,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,GAE1D,KAAK,YACP,KAAK,UAAU,YAAc,OAAOC,CAAO,EAAE,SAAS,EAAG,GAAG,EAElE,CAEE,WAAWP,EAAM,CACf,KAAK,QAAUA,EAAK,UACpB,KAAK,OAAM,CACf,CAEE,QAAQO,EAAS,CACf,KAAK,SAAWA,EAAU,IAC1B,KAAK,OAAM,CACf,CAEE,kBAAmB,CACjB,KAAK,QAAQ,cAAc,IAAI,YAAY,wBAAyB,CAClE,OAAQ,CAAA,EACT,CAAC,CACN,CAEE,SAAU,CACR,KAAK,KAAI,EACT,KAAK,QAAU,KACf,KAAK,UAAY,KACjB,KAAK,UAAY,KACjB,KAAK,QAAU,IACnB,EAGA,SAASsjB,EAAc7yB,EAAS,CAC9B,GAAIA,EAAQ,oBAAqB,OAEjC,MAAM2C,EAAW,IAAI4vB,EAAUvyB,CAAO,EACtCA,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EAChC,CAEA,SAAS8yB,EAAiB9yB,EAAS,CACjC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAChC,CAEA,SAAS+yB,GAAiB,CACL,SAAS,iBAAiB,eAAe,EACjD,QAAQ3T,GAAM,CACvByT,EAAczT,CAAE,CACpB,CAAG,CACH,CAEqCrd,EAAO,QAC1CA,EAAA,QAAiB,CAAE,UAAAwwB,EAAW,eAAAQ,EAAgB,cAAAF,EAAe,iBAAAC,IAE7D,OAAO,UAAYP,EACnB,OAAO,cAAgBM,EACvB,OAAO,iBAAmBC,GAGxB,OAAO,mBACT,OAAO,kBAAkB,SAAS,YAAaD,EAAeC,CAAgB,0FC9IhF,MAAME,CAAY,CACd,YAAYhzB,EAAS,CAOjB,GANA,KAAK,QAAUA,EACf,KAAK,SAAWA,EAAQ,cAAc,iCAAiC,EACvE,KAAK,QAAUA,EAAQ,cAAc,iCAAiC,EACtE,KAAK,QAAUA,EAAQ,cAAc,yBAAyB,EAC9D,KAAK,WAAa,GAEd,CAAC,KAAK,UAAY,CAAC,KAAK,SAAW,CAAC,KAAK,QACzC,MAAM,IAAI,MAAM,wCAAwC,EAG5D,KAAK,IAAM,SAAS,KAAK,QAAQ,aAAa,KAAK,CAAC,GAAK,KACzD,KAAK,IAAM,SAAS,KAAK,QAAQ,aAAa,KAAK,CAAC,GAAK,IACzD,KAAK,KAAO,SAAS,KAAK,QAAQ,aAAa,MAAM,CAAC,GAAK,EAE3D,KAAK,KAAI,CACjB,CAEI,MAAO,CACH,KAAK,WAAU,EACf,KAAK,YAAW,CACxB,CAEI,YAAa,CACT,MAAMizB,EAAe,IAAM,KAAK,YAAY,CAAC,KAAK,IAAI,EAChDC,EAAc,IAAM,KAAK,YAAY,KAAK,IAAI,EAC9CC,EAAe,IAAM,KAAK,cAEhC,KAAK,SAAS,iBAAiB,QAASF,CAAY,EACpD,KAAK,QAAQ,iBAAiB,QAASC,CAAW,EAClD,KAAK,QAAQ,iBAAiB,QAASC,CAAY,EAEnD,KAAK,WAAW,KACZ,CAAE,GAAI,KAAK,SAAU,MAAO,QAAS,QAASF,CAAY,EAC1D,CAAE,GAAI,KAAK,QAAS,MAAO,QAAS,QAASC,CAAW,EACxD,CAAE,GAAI,KAAK,QAAS,MAAO,QAAS,QAASC,CAAY,CACrE,CACA,CAEI,YAAYxuB,EAAO,CACf,IAAIvE,EAAQ,SAAS,KAAK,QAAQ,KAAK,GAAK,EAC5CA,GAASuE,EAELvE,EAAQ,KAAK,MAAKA,EAAQ,KAAK,KAC/BA,EAAQ,KAAK,MAAKA,EAAQ,KAAK,KAEnC,KAAK,QAAQ,MAAQA,EACrB,KAAK,QAAQ,cAAc,IAAI,MAAM,QAAQ,CAAC,EAC9C,KAAK,YAAW,EAChB,KAAK,eAAc,CAC3B,CAEI,aAAc,CACV,IAAIA,EAAQ,SAAS,KAAK,QAAQ,KAAK,EACnC,MAAMA,CAAK,IAAGA,EAAQ,GACtBA,EAAQ,KAAK,MAAKA,EAAQ,KAAK,KAC/BA,EAAQ,KAAK,MAAKA,EAAQ,KAAK,KACnC,KAAK,QAAQ,MAAQA,EACrB,KAAK,YAAW,EAChB,KAAK,eAAc,CAC3B,CAEI,aAAc,CACV,MAAMA,EAAQ,SAAS,KAAK,QAAQ,KAAK,GAAK,EAC9C,KAAK,SAAS,SAAWA,GAAS,KAAK,IACvC,KAAK,QAAQ,SAAWA,GAAS,KAAK,GAC9C,CAEI,SAASA,EAAO,CACRA,EAAQ,KAAK,MAAKA,EAAQ,KAAK,KAC/BA,EAAQ,KAAK,MAAKA,EAAQ,KAAK,KACnC,KAAK,QAAQ,MAAQA,EACrB,KAAK,YAAW,EAChB,KAAK,eAAc,CAC3B,CAEI,UAAW,CACP,OAAO,SAAS,KAAK,QAAQ,KAAK,GAAK,CAC/C,CAEI,SAASmO,EAAK9D,EAAK,CACf,KAAK,IAAM8D,EACX,KAAK,IAAM9D,EACX,KAAK,YAAW,CACxB,CAEI,gBAAiB,CACb,KAAK,QAAQ,cAAc,IAAI,YAAY,yBAA0B,CACjE,OAAQ,CACJ,MAAO,KAAK,SAAQ,GAE3B,CAAC,CACV,CAEI,SAAU,CACN,KAAK,WAAW,QAAQ,CAAC,CAAE,GAAA2U,EAAI,MAAAC,EAAO,QAAA3e,KAAc,CAChD0e,EAAG,oBAAoBC,EAAO3e,CAAO,CACjD,CAAS,EACD,KAAK,WAAa,KAClB,KAAK,SAAW,KAChB,KAAK,QAAU,KACf,KAAK,QAAU,KACf,KAAK,QAAU,IACvB,EAGA,SAAS0yB,EAAgBpzB,EAAS,CAC9B,GAAI,CAAAA,EAAQ,oBAEZ,GAAI,CACA,MAAM2C,EAAW,IAAIqwB,EAAYhzB,CAAO,EACxCA,EAAQ,iBAAmB2C,EAC3B3C,EAAQ,oBAAsB,EACtC,OAAae,EAAO,CACZ,QAAQ,MAAM,oCAAqCA,CAAK,CAChE,CACA,CAEA,SAASsyB,EAAmBrzB,EAAS,CACjC,GAAI,CAACA,EAAQ,qBAAuB,CAACA,EAAQ,iBAAkB,OAE9CA,EAAQ,iBAChB,QAAO,EAEhBA,EAAQ,iBAAmB,KAC3BA,EAAQ,oBAAsB,EAClC,CAEA,SAASszB,GAAmB,CACxB,SAAS,iBAAiB,kBAAkB,EAAE,QAAQrW,GAAS,CAC3DmW,EAAgBnW,CAAK,CAC7B,CAAK,CACL,CAEqClb,EAAO,QACxCA,EAAA,QAAiB,CAAE,YAAAixB,EAAa,iBAAAM,EAAkB,gBAAAF,EAAiB,mBAAAC,IAEnE,OAAO,YAAcL,EACrB,OAAO,gBAAkBI,EACzB,OAAO,mBAAqBC,GAG5B,OAAO,mBACP,OAAO,kBAAkB,SAAS,eAAgBD,EAAiBC,CAAkB,0FChJzF,MAAME,CAAa,CACjB,YAAYpvB,EAAW,CACrB,KAAK,UAAYA,EACjB,KAAK,MAAQA,EAAU,cAAc,2BAA2B,EAChE,KAAK,IAAMA,EAAU,cAAc,yBAAyB,EAC5D,KAAK,KAAOA,EAAU,cAAc,0BAA0B,EAC9D,KAAK,SAAWA,EAAU,cAAc,8BAA8B,EACtE,KAAK,SAAWA,EAAU,cAAc,4BAA4B,EACpE,KAAK,WAAaA,EAAU,cAAc,6BAA6B,EACvE,KAAK,iBAAmBA,EAAU,cAAc,oCAAoC,EAEpF,KAAK,OAAS,CACZ,UAAW,EACX,UAAW,GACX,YAAa,IACb,YAAa,IACb,cAAe,GACf,YAAa,CACnB,EAEI,KAAK,WAAa,GAClB,KAAK,OAAS,EACd,KAAK,OAAS,EACd,KAAK,SAAW,EAChB,KAAK,UAAY,GACjB,KAAK,UAAY,EACjB,KAAK,WAAa,GAClB,KAAK,aAAe,GACpB,KAAK,SAAW,EAEhB,KAAK,QAAU,EACf,KAAK,YAAc,EACnB,KAAK,MAAQ,EACb,KAAK,gBAAkB,EACvB,KAAK,SAAW,SAASA,EAAU,aAAa,YAAY,CAAC,GAAK,GAClE,KAAK,MAAQA,EAAU,aAAa,YAAY,GAAK,SACrD,KAAK,cAAgB,KAAK,QAAU,SAEpC,KAAK,MAAQ,gBAAgB,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,GAEpE,KAAK,kBAAoB,KACzB,KAAK,kBAAoB,KACzB,KAAK,gBAAkB,KACvB,KAAK,mBAAqB,KAC1B,KAAK,kBAAoB,KACzB,KAAK,iBAAmB,KAExB,KAAK,mBAAqB,KAC1B,KAAK,iBAAmB,KACxB,KAAK,mBAAqB,KAC1B,KAAK,kBAAoB,IAC7B,CAEE,MAAO,CACD,CAAC,KAAK,OAAS,CAAC,KAAK,KACrB,KAAK,UAAU,eAEnB,KAAK,kBAAqBxD,GAAM,CAC1B,KAAK,YAAc,KAAK,eAC5BA,EAAE,eAAc,EAChB,KAAK,WAAa,GAClB,KAAK,OAASA,EAAE,QAChB,KAAK,OAASA,EAAE,QAChB,KAAK,UAAY,KAAK,MACtB,KAAK,UAAY,GACjB,KAAK,UAAU,UAAU,IAAI,WAAW,EACpC,KAAK,OACP,KAAK,KAAK,YAAc,SACxB,KAAK,KAAK,MAAM,MAAQ,8BAEhC,EAEI,KAAK,kBAAqBA,GAAM,CAC9B,GAAI,CAAC,KAAK,WAAY,OACtBA,EAAE,eAAc,EAEhB,MAAM6yB,EAAa,KAAK,MAAM,YACxBC,EAAW,KAAK,IAAI,YACpBC,EAAYF,EAAaC,EAAW,EAE1C,IAAIE,EAAShzB,EAAE,QAAU,KAAK,OAC1BgzB,EAAS,IAAGA,EAAS,GACrBA,EAASD,IAAWC,EAASD,GAEjC,KAAK,SAAWC,EAChB,KAAK,IAAI,MAAM,KAAQ,GAAKA,EAAU,KAClC,KAAK,WAAU,KAAK,SAAS,MAAM,MAAUA,EAASD,EAAa,IAAO,KAE9E,KAAK,aAAa/yB,EAAE,QAASA,EAAE,OAAO,CAC5C,EAEI,KAAK,gBAAkB,IAAM,CACtB,KAAK,aACV,KAAK,WAAa,GAClB,KAAK,UAAU,UAAU,OAAO,WAAW,EAC3C,KAAK,cAAa,EACxB,EAEI,KAAK,mBAAsBA,GAAM,CAC3B,KAAK,YAAc,KAAK,eAC5BA,EAAE,eAAc,EAChB,KAAK,WAAa,GAClB,KAAK,OAASA,EAAE,QAAQ,CAAC,EAAE,QAC3B,KAAK,OAASA,EAAE,QAAQ,CAAC,EAAE,QAC3B,KAAK,UAAY,KAAK,MACtB,KAAK,UAAY,GACjB,KAAK,UAAU,UAAU,IAAI,WAAW,EACpC,KAAK,OACP,KAAK,KAAK,YAAc,SACxB,KAAK,KAAK,MAAM,MAAQ,8BAEhC,EAEI,KAAK,kBAAqBA,GAAM,CAC9B,GAAI,CAAC,KAAK,WAAY,OACtBA,EAAE,eAAc,EAEhB,MAAM6yB,EAAa,KAAK,MAAM,YACxBC,EAAW,KAAK,IAAI,YACpBC,EAAYF,EAAaC,EAAW,EAE1C,IAAIE,EAAShzB,EAAE,QAAQ,CAAC,EAAE,QAAU,KAAK,OACrCgzB,EAAS,IAAGA,EAAS,GACrBA,EAASD,IAAWC,EAASD,GAEjC,KAAK,SAAWC,EAChB,KAAK,IAAI,MAAM,KAAQ,GAAKA,EAAU,KAClC,KAAK,WAAU,KAAK,SAAS,MAAM,MAAUA,EAASD,EAAa,IAAO,KAE9E,KAAK,aAAa/yB,EAAE,QAAQ,CAAC,EAAE,QAASA,EAAE,QAAQ,CAAC,EAAE,OAAO,CAClE,EAEI,KAAK,iBAAmB,IAAM,CACvB,KAAK,aACV,KAAK,WAAa,GAClB,KAAK,UAAU,UAAU,OAAO,WAAW,EAC3C,KAAK,cAAa,EACxB,EAEI,KAAK,IAAI,iBAAiB,YAAa,KAAK,iBAAiB,EAEzD,OAAO,cACT,KAAK,mBAAqB,OAAO,aAAa,GAAG,SAAU,YAAa,KAAK,kBAAmB,CAAE,MAAO,KAAK,KAAK,CAAE,EACrH,KAAK,iBAAmB,OAAO,aAAa,GAAG,SAAU,UAAW,KAAK,gBAAiB,CAAE,MAAO,KAAK,KAAK,CAAE,EAC/G,KAAK,mBAAqB,OAAO,aAAa,GAAG,SAAU,YAAa,KAAK,kBAAmB,CAAE,MAAO,KAAK,MAAO,QAAS,EAAK,CAAE,EACrI,KAAK,kBAAoB,OAAO,aAAa,GAAG,SAAU,WAAY,KAAK,iBAAkB,CAAE,MAAO,KAAK,KAAK,CAAE,IAElH,SAAS,iBAAiB,YAAa,KAAK,iBAAiB,EAC7D,SAAS,iBAAiB,UAAW,KAAK,eAAe,EACzD,SAAS,iBAAiB,YAAa,KAAK,kBAAmB,CAAE,QAAS,EAAK,CAAE,EACjF,SAAS,iBAAiB,WAAY,KAAK,gBAAgB,GAG7D,KAAK,IAAI,iBAAiB,aAAc,KAAK,mBAAoB,CAAE,QAAS,EAAK,CAAE,EAE/E,KAAK,YACP,KAAK,WAAW,iBAAiB,QAAS,IAAM,KAAK,YAAW,CAAE,EAEhE,KAAK,kBACP,KAAK,iBAAiB,iBAAiB,QAAS,IAAM,KAAK,YAAW,CAAE,EAG1E,KAAK,UAAU,aAAe,GAC9B,KAAK,YAAW,EACpB,CAEE,gBAAiB,CACf,MAAM6yB,EAAa,KAAK,MAAM,YACxBC,EAAW,KAAK,IAAI,YACpBG,EAAY,GACZrlB,EAAMilB,EAAa,IACnB/oB,EAAM+oB,EAAa,IAAOC,EAC1BI,EAAML,EAAa,GAIzB,GAFA,KAAK,MAAQ,KAAK,MAAM,KAAK,OAAM,GAAM,KAAK,SAAW,EAAE,EAEvD,KAAK,cACP,GACE,KAAK,gBAAkB,KAAK,MAAM,KAAK,OAAM,GAAM,KAAK,SAAW,EAAE,QAC9D,KAAK,IAAI,KAAK,gBAAkB,KAAK,KAAK,EAAI,GAGrD,KAAK,cACM,KAAK,SACP,IACT,KAAK,QAAU,KAAK,MAAMjlB,EAAM,KAAK,OAAM,GAAMslB,EAAMtlB,EAAMklB,EAAS,EACtE,KAAK,YAAc,KAAK,MAAMI,EAAM,KAAK,UAAYppB,EAAMopB,EAAI,IAE/D,KAAK,QAAU,KAAK,MAAMA,EAAM,KAAK,UAAYppB,EAAMopB,EAAI,EAC3D,KAAK,YAAc,KAAK,MAAMtlB,EAAM,KAAK,OAAM,GAAMslB,EAAMtlB,EAAMklB,EAAS,GAG5E,KAAK,QAAU,KAAK,MAAMllB,EAAM,KAAK,UAAY9D,EAAM8D,EAAI,EAG7D,MAAM6H,EAAS,KAAK,UAAU,cAAc,4BAA4B,EAOxE,GANIA,IACFA,EAAO,MAAM,KAAQ,KAAK,QAAUwd,EAAYH,EAAW,EAAK,KAChErd,EAAO,MAAM,UAAY,gCAAkC,KAAK,MAAQ,OACxEA,EAAO,MAAM,QAAU,SAGrB,KAAK,cAAe,CACtB,MAAM0d,EAAa,KAAK,UAAU,cAAc,wCAAwC,EACpFA,IACFA,EAAW,MAAM,KAAQ,KAAK,YAAcF,EAAYH,EAAW,EAAK,KACxEK,EAAW,MAAM,UAAY,gCAAkC,KAAK,gBAAkB,OACtFA,EAAW,MAAM,QAAU,QAEnC,KAAW,CACL,MAAMA,EAAa,KAAK,UAAU,cAAc,wCAAwC,EACpFA,IACFA,EAAW,MAAM,QAAU,OAEnC,CACA,CAEE,aAAc,CACZ,KAAK,IAAI,UAAY,yBACrB,KAAK,IAAI,MAAM,UAAY,UAAY,KAAK,MAAQ,OACpD,KAAK,IAAI,UAAY,GACrB,KAAK,IAAI,MAAM,KAAO,OACtB,KAAK,IAAI,MAAM,QAAU,QACrB,KAAK,WACP,KAAK,SAAS,MAAM,MAAQ,KAC5B,KAAK,SAAS,MAAM,QAAU,SAE5B,KAAK,OACP,KAAK,KAAK,YAAc,eACxB,KAAK,KAAK,MAAM,MAAQ,IAEtB,KAAK,aACP,KAAK,WAAW,MAAM,QAAU,QAElC,KAAK,SAAW,EAChB,KAAK,UAAY,GACjB,KAAK,UAAU,UAAU,OAAO,cAAe,WAAY,aAAa,CAC5E,CAEE,aAAc,CACZ,KAAK,WAAa,GAClB,KAAK,aAAe,GACpB,KAAK,SAAW,EAChB,KAAK,eAAc,EACnB,KAAK,YAAW,EACZ,KAAK,WACP,KAAK,SAAS,YAAc,QAC5B,KAAK,SAAS,UAAY,4BAEhC,CAEE,aAAaC,EAASC,EAAS,CAE7B,MAAMvR,EADM,KAAK,MACD,KAAK,UAErB,IAAIwR,EAAW,EACXC,EAAe,EAEnB,GAAI,KAAK,UAAU,OAAS,EAAG,CAC7B,MAAMC,EAAO,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAC/CzC,EAAK,KAAK,SAAWyC,EAAK,EAC1BC,EAAK3R,EAAI0R,EAAK,EACpB,GAAIC,EAAK,IACPH,EAAWvC,EAAK0C,EACZ,KAAK,UAAU,OAAS,GAAG,CAC7B,MAAMC,EAAO,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAC/CC,EAASH,EAAK,EAAIE,EAAK,EAC7B,GAAIC,EAAS,EAAG,CACd,MAAMC,GAASJ,EAAK,EAAIE,EAAK,GAAKC,EAClCJ,EAAeD,EAAWM,CACtC,CACA,CAEA,CAEI,KAAK,UAAU,KAAK,CAClB,EAAG,KAAK,SACR,EAAGP,EAAU,KAAK,OAClB,EAAGvR,EACH,EAAGwR,EACH,EAAGC,CACT,CAAK,EAED,MAAMM,EAAe,KAAK,UAAU,cAAc,iCAAiC,EAC/EA,IACFA,EAAa,YAAc,QAAU,KAAK,UAAU,OAE1D,CAEE,eAAgB,CACd,GAAI,CAAC,KAAK,WAAa,KAAK,UAAU,OAAS,KAAK,OAAO,UACzD,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,MAAMC,EAAS,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAAE,EACnDC,EAAiB,KAAK,cAAgB,KAAK,IAAID,EAAS,KAAK,WAAW,EAAI,IAC5EE,EAAa,KAAK,IAAIF,EAAS,KAAK,OAAO,EAEjD,GAAI,KAAK,eAAiBC,EAAiBC,GAAcD,GAAkB,KAAK,OAAO,UACrF,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,GAAIC,EAAa,KAAK,OAAO,UAC3B,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,MAAMC,EAAS,CAAA,EACf,QAAS1tB,EAAI,EAAGA,EAAI,KAAK,UAAU,OAAQA,IAAK,CAC9C,MAAMwqB,EAAK,KAAK,UAAUxqB,CAAC,EAAE,EAAI,KAAK,UAAUA,EAAI,CAAC,EAAE,EACjDktB,EAAK,KAAK,UAAUltB,CAAC,EAAE,EAAI,KAAK,UAAUA,EAAI,CAAC,EAAE,EACnDktB,EAAK,GAAKA,EAAK,KACjBQ,EAAO,KAAKlD,EAAK0C,CAAE,CAE3B,CAEI,GAAIQ,EAAO,OAAS,EAClB,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,MAAMC,EAAW,KAAK,IAAI,GAAGD,CAAM,EAC7BE,EAAW,KAAK,IAAI,GAAGF,CAAM,EACnC,GAAIC,EAAWC,EAAW,KAAK,OAAO,cACpC,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,IAAIC,EAAe,GACnB,UAAWC,KAAK,KAAK,UACnB,GAAI,KAAK,IAAIA,EAAE,CAAC,EAAI,EAAG,CACrBD,EAAe,GACf,KACR,CAEI,GAAI,CAACA,GAAgB,KAAK,UAAU,OAAS,GAC3C,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,MAAME,EAAY,KAAK,UAAU,KAAK,UAAU,OAAS,CAAC,EAAE,EAC5D,GAAIA,EAAY,KAAK,OAAO,YAC1B,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAErC,GAAIA,EAAY,KAAK,OAAO,YAC1B,MAAO,CAAE,OAAQ,GAAO,IAAK,MAAM,EAGrC,MAAMC,EAAgB,CAAA,EACtB,QAAShuB,EAAI,EAAGA,EAAI0tB,EAAO,OAAQ1tB,IACjCguB,EAAc,KAAK,KAAK,IAAIN,EAAO1tB,CAAC,EAAI0tB,EAAO1tB,EAAI,CAAC,CAAC,CAAC,EAExD,OAAIguB,EAAc,OAAS,GACVA,EAAc,OAAO,CAAC5rB,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAAI2rB,EAAc,OAC3D,IACJ,CAAE,OAAQ,GAAO,IAAK,MAAM,EAIhC,CAAE,OAAQ,GAAM,IAAK,MAAM,CACtC,CAEE,eAAgB,CACV,KAAK,cAAgB,KAAK,aAC9B,KAAK,aAAe,GAEhB,KAAK,WACP,KAAK,SAAS,YAAc,SAC5B,KAAK,SAAS,UAAY,wCAE5B,KAAK,IAAI,MAAM,OAAS,OACxB,KAAK,UAAU,UAAU,IAAI,aAAa,EAE1C,WAAW,IAAM,CACf,MAAMj0B,EAAS,KAAK,gBAIpB,GAHA,KAAK,aAAe,GACpB,KAAK,IAAI,MAAM,OAAS,GAEpBA,EAAO,OAAQ,CACjB,KAAK,WAAa,GAClB,KAAK,IAAI,MAAM,QAAU,OACrB,KAAK,WAAU,KAAK,SAAS,MAAM,QAAU,QAEjD,MAAMmV,EAAS,KAAK,UAAU,cAAc,4BAA4B,EACpEA,IAAQA,EAAO,MAAM,QAAU,QAEnC,MAAM0d,EAAa,KAAK,UAAU,cAAc,wCAAwC,EACpFA,IAAYA,EAAW,MAAM,QAAU,QAEvC,KAAK,OACP,KAAK,KAAK,YAAc,OACxB,KAAK,KAAK,MAAM,MAAQ,iCAEtB,KAAK,WACP,KAAK,SAAS,YAAc,OAC5B,KAAK,SAAS,UAAY,wCAE5B,KAAK,UAAU,UAAU,IAAI,aAAa,EAC1C,KAAK,UAAU,UAAU,OAAO,aAAa,EAE7C,MAAMqB,EAAa,KAAK,UAAU,aAAa,kBAAkB,EAC7DA,GAAc,OAAO,OAAOA,CAAU,GAAM,YAC9C,OAAOA,CAAU,EAAE,KAAK,SAAS,CAE3C,SACQ,KAAK,WAED,KAAK,OACP,KAAK,KAAK,YAAcl0B,EAAO,IAC/B,KAAK,KAAK,MAAM,MAAQ,+BAEtB,KAAK,WACP,KAAK,SAAS,YAAcA,EAAO,IACnC,KAAK,SAAS,UAAY,sCAGT,KAAK,UAAU,aAAa,kBAAkB,IAC9C,OACjB,WAAW,IAAM,CACf,KAAK,YAAW,CAC5B,EAAa,IAAI,MACF,CACL,KAAK,IAAI,MAAM,QAAU,OACrB,KAAK,WAAU,KAAK,SAAS,MAAM,QAAU,QAEjD,MAAMmV,EAAS,KAAK,UAAU,cAAc,4BAA4B,EACpEA,IAAQA,EAAO,MAAM,QAAU,QAEnC,MAAM0d,EAAa,KAAK,UAAU,cAAc,wCAAwC,EACpFA,IAAYA,EAAW,MAAM,QAAU,QAEvC,KAAK,aACP,KAAK,WAAW,MAAM,QAAU,QAE5C,CAEA,EAAO,GAAG,EACV,CAEE,SAAU,CACH,KAAK,UAAU,eAEhB,KAAK,KAAO,KAAK,mBACnB,KAAK,IAAI,oBAAoB,YAAa,KAAK,iBAAiB,EAE9D,KAAK,KAAO,KAAK,oBACnB,KAAK,IAAI,oBAAoB,aAAc,KAAK,kBAAkB,EAGhE,KAAK,YACP,KAAK,WAAW,oBAAoB,QAAS,IAAM,KAAK,YAAW,CAAE,EAEnE,KAAK,kBACP,KAAK,iBAAiB,oBAAoB,QAAS,IAAM,KAAK,YAAW,CAAE,EAGzE,KAAK,oBAAsB,KAAK,mBAAmB,YACrD,KAAK,mBAAmB,cACf,KAAK,mBACd,SAAS,oBAAoB,YAAa,KAAK,iBAAiB,EAG9D,KAAK,kBAAoB,KAAK,iBAAiB,YACjD,KAAK,iBAAiB,cACb,KAAK,iBACd,SAAS,oBAAoB,UAAW,KAAK,eAAe,EAG1D,KAAK,oBAAsB,KAAK,mBAAmB,YACrD,KAAK,mBAAmB,cACf,KAAK,mBACd,SAAS,oBAAoB,YAAa,KAAK,iBAAiB,EAG9D,KAAK,mBAAqB,KAAK,kBAAkB,YACnD,KAAK,kBAAkB,cACd,KAAK,kBACd,SAAS,oBAAoB,WAAY,KAAK,gBAAgB,EAGhE,KAAK,UAAU,aAAe,GAClC,EAGA,SAASsB,GAAoB,CAC3B,SAAS,iBAAiB,oBAAoB,EAAE,QAAQjxB,GAAa,CACnE,MAAMkxB,EAAU,IAAI9B,EAAapvB,CAAS,EAC1CkxB,EAAQ,KAAI,EACZlxB,EAAU,oBAAsBkxB,CACpC,CAAG,CACH,CAEA,SAASC,EAAoBnxB,EAAW,CAClCA,EAAU,sBACZA,EAAU,oBAAoB,UAC9BA,EAAU,oBAAsB,KAEpC,CAEA,SAASoxB,GAA0B,CACjC,SAAS,iBAAiB,oBAAoB,EAAE,QAAQpxB,GAAa,CACnEmxB,EAAoBnxB,CAAS,CACjC,CAAG,CACH,CAEqCpC,EAAO,UACxCA,EAAA,QAAiB,CAAE,kBAAAqzB,EAAmB,oBAAAE,EAAqB,wBAAAC,CAAuB,yBCtfrF,SAASC,EAAQ,CACd,IAAIC,EAAsB,KAE1B,MAAMC,CAAa,CACf,YAAYjxB,EAAW,CACnB,KAAK,UAAYA,EACjB,KAAK,UAAaA,GAAaA,EAAU,WAAc,KACvD,KAAK,mBAAqB,GAC1B,KAAK,qBAAuB,GAC5B,KAAK,mBAAqB,GAC1B,KAAK,SAAW,GAChB,KAAK,MAAQ,IAAI,IACjB,KAAK,cAAgB,IAAI,GAC7B,CAEA,IAAIuI,EAAe,KAAM,CACrB,GAAIwoB,EAAO,WAAY,CACnB,MAAM5zB,EAAM,SAAS,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,CAAC,KAC5D,OAAA4zB,EAAO,WAAW,IAAI5zB,EAAKoL,CAAY,EAEhC,CACH,IAAI,OAAQ,CACR,OAAOwoB,EAAO,WAAW,IAAI5zB,CAAG,CACpC,EACA,IAAI,MAAMgW,EAAU,CAChB4d,EAAO,WAAW,IAAI5zB,EAAKgW,CAAQ,CACvC,EACA,KAAMhW,CAC1B,CACY,CAEA,MAAM+zB,EAAS,CACX,OAAQ3oB,EACR,aAAc,IAAI,GAClC,EAEY,cAAO,eAAe2oB,EAAQ,QAAS,CACnC,KAAM,CACF,OAAOA,EAAO,MAClB,EACA,IAAI/d,EAAU,CACNA,IAAa+d,EAAO,SACpBA,EAAO,OAAS/d,EAChB+d,EAAO,aAAa,QAAQC,GAAOA,EAAIhe,CAAQ,CAAC,EAExD,CAChB,CAAa,EAEM+d,CACX,CAEA,SAASvf,EAAQ,CACb,GAAIof,EAAO,WACP,OAAOA,EAAO,WAAW,eAAepf,CAAM,EAGlD,MAAMyf,EAAO,KACPn1B,EAAU,CACZ,IAAI0V,EAAQxU,EAAK,CACb,GAAIA,IAAQ,eAAgB,MAAO,GACnC,GAAIA,IAAQ,QAAS,OAAOwU,EAC5B,MAAMnV,EAASmV,EAAOxU,CAAG,EACzB,OAAI,OAAOX,GAAW,UAAYA,IAAW,MAAQ,CAACA,EAAO,eACzDmV,EAAOxU,CAAG,EAAIi0B,EAAK,SAAS50B,CAAM,GAE/BmV,EAAOxU,CAAG,CACrB,EACA,IAAIwU,EAAQxU,EAAKxB,EAAO,CACpB,OAAIgW,EAAOxU,CAAG,IAAMxB,IACpBgW,EAAOxU,CAAG,EAAIxB,EACdy1B,EAAK,gBAAgBj0B,EAAKxB,CAAK,GACxB,EACX,EACA,eAAegW,EAAQxU,EAAK,CACxB,cAAOwU,EAAOxU,CAAG,EACjBi0B,EAAK,gBAAgBj0B,EAAK,MAAS,EAC5B,EACX,CAChB,EAEkB4U,EAAQ,IAAI,MAAMJ,EAAQ1V,CAAO,EACvC,OAAA8V,EAAM,aAAe,GACdA,CACX,CAEA,UAAU9V,EAAS,CACX,KAAK,UACL,KAAK,UAAU,GAAG,QAASA,EAAS,CAAE,KAAM,WAAW,CAAE,EAEzD,KAAK,mBAAmB,KAAKA,CAAO,CAE5C,CAEA,YAAYA,EAAS,CACb,KAAK,UACL,KAAK,UAAU,GAAG,UAAWA,EAAS,CAAE,KAAM,aAAa,CAAE,EAE7D,KAAK,qBAAqB,KAAKA,CAAO,CAE9C,CAEA,UAAUA,EAAS,CACX,KAAK,UACL,KAAK,UAAU,GAAG,SAAUA,EAAS,CAAE,KAAM,WAAW,CAAE,EAE1D,KAAK,mBAAmB,KAAKA,CAAO,CAE5C,CAEA,MAAMo1B,EAAQp1B,EAASwC,EAAU,CAAA,EAAI,CACjC,GAAI,OAAO4yB,GAAW,WAAY,CAC9B,MAAMC,EAAU,IAAM,CAClB,MAAMne,EAAWke,IACble,IAAame,EAAQ,YACrBr1B,EAAQkX,EAAUme,EAAQ,SAAS,EACnCA,EAAQ,UAAYne,EAE5B,EAKA,GAJAme,EAAQ,UAAY,OACpB,KAAK,SAAS,KAAKA,CAAO,EAC1BA,IAEIP,EAAO,WAAY,CACnB,MAAMQ,EAAe,CAAA,EACfC,EAAcT,EAAO,WAAW,IACtCA,EAAO,WAAW,IAAM,SAAS3e,EAAG,CAChC,OAAAmf,EAAa,KAAKnf,CAAC,EACZof,EAAY,KAAK,KAAMpf,CAAC,CACnC,EACAif,IACAN,EAAO,WAAW,IAAMS,EAExBD,EAAa,QAAQxyB,GAAQ,CACzBgyB,EAAO,WAAW,QAAQhyB,EAAMuyB,CAAO,CAC3C,CAAC,CACL,CACJ,MAAW,OAAOD,GAAW,UAAYA,IAAW,OAC5CA,EAAO,aACPA,EAAO,aAAa,IAAIp1B,CAAO,EACxBo1B,EAAO,MAAQN,EAAO,YAC7BA,EAAO,WAAW,QAAQM,EAAO,KAAM,IAAM,CACzCp1B,EAAQo1B,EAAO,KAAK,CACxB,CAAC,EAGb,CAEA,SAASI,EAAQ,CACb,MAAMj1B,EAAS,KAAK,MAGpB,IAAIk1B,EAAS,IAAM,CACf,GAAI,CACAl1B,EAAO,MAAQi1B,GACnB,OAASv1B,EAAG,CACR,QAAQ,MAAM,2BAA4BA,CAAC,CAC/C,CACJ,EAEA,MAAMq1B,EAAe,CAAA,EACrB,GAAIR,EAAO,WAAY,CACnB,MAAMS,EAAcT,EAAO,WAAW,IACtCA,EAAO,WAAW,IAAM,SAAS3e,EAAG,CAChC,OAAAmf,EAAa,KAAKnf,CAAC,EACZof,EAAY,KAAK,KAAMpf,CAAC,CACnC,EAEAsf,IAEAX,EAAO,WAAW,IAAMS,EAExBD,EAAa,QAAQxyB,GAAQ,CACzBgyB,EAAO,WAAW,QAAQhyB,EAAM2yB,CAAM,CAC1C,CAAC,EAED,KAAK,cAAc,IAAIl1B,EAAQ+0B,CAAY,CAC/C,MACIG,IAGJ,IAAIC,EAAgBn1B,EAAO,OAE3B,cAAO,eAAeA,EAAQ,QAAS,CACnC,IAAK,IAAMm1B,EACX,IAAMxe,GAAa,CACf,QAAQ,KAAK,sCAAsC,CACvD,CAChB,CAAa,EAGDue,EAAS,IAAM,CACX,GAAI,CACAC,EAAgBF,EAAM,CAC1B,OAASv1B,EAAG,CACR,QAAQ,MAAM,2BAA4BA,CAAC,CAC/C,CACJ,EAEOM,CACX,CAEA,KAAKT,EAAWC,EAAM,CACd,KAAK,WACL,KAAK,UAAU,MAAMD,EAAWC,CAAI,CAE5C,CAEA,gBAAgBmB,EAAKxB,EAAO,CACxB,KAAK,SAAS,QAAQ21B,GAAW,CAC7B,GAAI,CAAEA,EAAO,CAAI,OAASp1B,EAAG,CAAE,QAAQ,MAAMA,CAAC,CAAG,CACrD,CAAC,CACL,CAEA,iBAAkB,CACd,KAAK,mBAAmB,QAAQD,GAAW,CACvC,GAAI,CAAEA,EAAO,CAAI,OAASC,EAAG,CAAE,QAAQ,MAAMA,CAAC,CAAG,CACrD,CAAC,CACL,CAEA,mBAAoB,CAChB,KAAK,qBAAqB,QAAQD,GAAW,CACzC,GAAI,CAAEA,EAAO,CAAI,OAASC,EAAG,CAAE,QAAQ,MAAMA,CAAC,CAAG,CACrD,CAAC,CACL,CAEA,iBAAkB,CACd,KAAK,mBAAmB,QAAQD,GAAW,CACvC,GAAI,CAAEA,EAAO,CAAI,OAASC,EAAG,CAAE,QAAQ,MAAMA,CAAC,CAAG,CACrD,CAAC,CACL,CAEA,SAAU,CACN,KAAK,SAAS,QAAQo1B,GAAW,CACzBA,EAAQ,cACRA,EAAQ,aAAa,OAE7B,CAAC,EACD,KAAK,SAAW,GAEhB,KAAK,cAAc,QAAQ,CAACM,EAAOp1B,IAAW,CAC1Co1B,EAAM,QAAQ7yB,GAAQ,CACdgyB,EAAO,YACPA,EAAO,WAAW,UAAUhyB,CAAI,CAExC,CAAC,CACL,CAAC,EACD,KAAK,cAAc,QAEnB,KAAK,MAAM,QACX,KAAK,mBAAqB,GAC1B,KAAK,qBAAuB,GAC5B,KAAK,mBAAqB,GAE1B,KAAK,UAAY,KACjB,KAAK,UAAY,IACrB,CACR,CAEI,SAAS8yB,EAAItpB,EAAe,KAAM,CAC9B,GAAIyoB,EACA,OAAOA,EAAoB,IAAIzoB,CAAY,EAG/C,GAAIwoB,EAAO,WAAY,CACnB,MAAM5zB,EAAM,SAAS,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,CAAC,KAC5D,OAAA4zB,EAAO,WAAW,IAAI5zB,EAAKoL,CAAY,EAEhC,CACH,IAAI,OAAQ,CACR,OAAOwoB,EAAO,WAAW,IAAI5zB,CAAG,CACpC,EACA,IAAI,MAAMgW,EAAU,CAChB4d,EAAO,WAAW,IAAI5zB,EAAKgW,CAAQ,CACvC,EACA,KAAMhW,CACtB,CACQ,CAEA,MAAM+zB,EAAS,CACX,OAAQ3oB,EACR,aAAc,IAAI,GAC9B,EAEQ,cAAO,eAAe2oB,EAAQ,QAAS,CACnC,KAAM,CACF,OAAOA,EAAO,MAClB,EACA,IAAI/d,EAAU,CACNA,IAAa+d,EAAO,SACpBA,EAAO,OAAS/d,EAChB+d,EAAO,aAAa,QAAQC,GAAOA,EAAIhe,CAAQ,CAAC,EAExD,CACZ,CAAS,EAEM+d,CACX,CAEA,SAASY,EAASngB,EAAQ,CACtB,GAAIqf,EACA,OAAOA,EAAoB,SAASrf,CAAM,EAG9C,GAAIof,EAAO,WACP,OAAOA,EAAO,WAAW,eAAepf,CAAM,EAGlD,MAAM1V,EAAU,CACZ,IAAI0V,EAAQxU,EAAK,CACb,GAAIA,IAAQ,eAAgB,MAAO,GACnC,GAAIA,IAAQ,QAAS,OAAOwU,EAC5B,MAAMnV,EAASmV,EAAOxU,CAAG,EACzB,OAAI,OAAOX,GAAW,UAAYA,IAAW,MAAQ,CAACA,EAAO,eACzDmV,EAAOxU,CAAG,EAAI,IAAI,MAAMX,EAAQP,CAAO,EACvC0V,EAAOxU,CAAG,EAAE,aAAe,IAExBwU,EAAOxU,CAAG,CACrB,EACA,IAAIwU,EAAQxU,EAAKxB,EAAO,CACpB,OAAIgW,EAAOxU,CAAG,IAAMxB,IACpBgW,EAAOxU,CAAG,EAAIxB,EACVq1B,GACAA,EAAoB,gBAAgB7zB,EAAKxB,CAAK,GAE3C,EACX,EACA,eAAegW,EAAQxU,EAAK,CACxB,cAAOwU,EAAOxU,CAAG,EACb6zB,GACAA,EAAoB,gBAAgB7zB,EAAK,MAAS,EAE/C,EACX,CACZ,EAEc4U,EAAQ,IAAI,MAAMJ,EAAQ1V,CAAO,EACvC,OAAA8V,EAAM,aAAe,GACdA,CACX,CAEA,SAASggB,EAAU91B,EAAS,CACpB+0B,EACAA,EAAoB,UAAU/0B,CAAO,EAErC,QAAQ,KAAK,qCAAqC,CAE1D,CAEA,SAAS+1B,EAAY/1B,EAAS,CACtB+0B,EACAA,EAAoB,YAAY/0B,CAAO,EAEvC,QAAQ,KAAK,uCAAuC,CAE5D,CAEA,SAASg2B,EAAUh2B,EAAS,CACpB+0B,EACAA,EAAoB,UAAU/0B,CAAO,EAErC,QAAQ,KAAK,qCAAqC,CAE1D,CAEA,SAASi2B,EAAMb,EAAQp1B,EAASwC,EAAU,CAAA,EAAI,CACtCuyB,GACAA,EAAoB,MAAMK,EAAQp1B,EAASwC,CAAO,CAE1D,CAEA,SAAS0zB,EAASV,EAAQ,CACtB,GAAIT,EACA,OAAOA,EAAoB,SAASS,CAAM,EAG9C,MAAMj1B,EAASq1B,IAEf,IAAIH,EAAS,IAAM,CACnB,GAAI,CACAl1B,EAAO,MAAQi1B,GACnB,OAASv1B,EAAG,CACR,QAAQ,MAAM,2BAA4BA,CAAC,CAC/C,CACJ,EAEA,GAAI60B,EAAO,WAAY,CACnB,MAAMQ,EAAe,CAAA,EACfC,EAAcT,EAAO,WAAW,IACtCA,EAAO,WAAW,IAAM,SAAS3e,EAAG,CAChC,OAAAmf,EAAa,KAAKnf,CAAC,EACZof,EAAY,KAAK,KAAMpf,CAAC,CACnC,EAEAsf,IAEAX,EAAO,WAAW,IAAMS,EAExBD,EAAa,QAAQxyB,GAAQ,CACzBgyB,EAAO,WAAW,QAAQhyB,EAAM2yB,CAAM,CAC1C,CAAC,CACL,MACIA,IAGJ,IAAIC,EAAgBn1B,EAAO,OAEvB,cAAO,eAAeA,EAAQ,QAAS,CACnC,IAAK,IAAMm1B,EACX,IAAMxe,GAAa,CACf,QAAQ,KAAK,sCAAsC,CACvD,CACZ,CAAS,EAGDue,EAAS,IAAM,CACX,GAAI,CACAC,EAAgBF,EAAM,CAC1B,OAASv1B,EAAG,CACR,QAAQ,MAAM,2BAA4BA,CAAC,CAC/C,CACJ,EAEOM,CACf,CAEI,SAAS41B,EAAMC,EAAS,CACpB,GAAI,OAAOA,GAAY,WAAY,CAC/B,QAAQ,MAAM,sCAAsC,EACpD,MACJ,CAEA,MAAMC,EAAe,IAAIrB,EACnBsB,EAAcvB,EACpBA,EAAsBsB,EAEtB,IAAI91B,EACJ,GAAI,CACAA,EAAS61B,EAAQC,CAAY,CACjC,QAAC,CACGtB,EAAsBuB,CAC1B,CAEA,OAAO/1B,CACX,CAEAu0B,EAAO,aAAeE,EACtBF,EAAO,IAAMc,EACbd,EAAO,SAAWe,EAClBf,EAAO,UAAYgB,EACnBhB,EAAO,YAAciB,EACrBjB,EAAO,UAAYkB,EACnBlB,EAAO,MAAQmB,EACfnB,EAAO,SAAWoB,EAClBpB,EAAO,MAAQqB,EACfrB,EAAO,wBAA0B,IAAMC,EACvCD,EAAO,wBAA2ByB,GAAQ,CAAExB,EAAsBwB,CAAK,EACvEzB,EAAO,mBAAqB,IAAM,CAAEC,EAAsB,IAAM,CACpE,EAAG,MAAM,ECzcR,SAASD,EAAQ,CACd,MAAM0B,CAAW,CACb,YAAYC,EAAgBj0B,EAAU,GAAI,CAmBtC,GAlBA,KAAK,KAAO,OAAOi0B,GAAmB,SAChC,SAAS,cAAcA,CAAc,EACrCA,EAEN,KAAK,QAAU,CACX,iBAAkB,GAClB,iBAAkB,GAClB,eAAgB,GAChB,eAAgB,GAChB,GAAGj0B,CACnB,EAEY,KAAK,eAAiB,GACtB,KAAK,aAAe,GACpB,KAAK,OAAS,GACd,KAAK,MAAQ,GACb,KAAK,UAAYsyB,EAAO,iBAAmB,IAAIA,EAAO,gBAElD,CAAC,KAAK,MAAQ,EAAE,KAAK,gBAAgB,iBAAkB,CACvD,QAAQ,KAAK,mCAAmC,EAChD,MACJ,CAEA,KAAK,MAAK,CACd,CAEA,OAAQ,CACA,KAAK,QAAQ,kBACb,KAAK,KAAK,iBAAiB,QAAU70B,GAAM,CACvC,KAAK,eAAeA,EAAE,MAAM,CAChC,CAAC,EAGD,KAAK,QAAQ,gBACb,KAAK,KAAK,iBAAiB,OAASA,GAAM,CAClCA,EAAE,OAAO,OAAS,KAAK,MACvB,KAAK,eAAeA,EAAE,MAAM,CAEpC,EAAG,EAAI,CAEf,CAEA,OAAOD,EAAS,CACZ,MAAM02B,EAAiB,MAAOz2B,GAAM,CAIhC,GAHI,KAAK,QAAQ,gBACbA,EAAE,eAAc,EAEhB,MAAK,aACT,MAAK,aAAe,GAEpB,GAAI,CACA,GAAI,KAAK,QAAQ,iBAAkB,CAC/B,MAAM02B,EAAa,MAAM,KAAK,WAC9B,GAAI,CAACA,EAAW,MAAO,CACnB,KAAK,YAAYA,EAAW,MAAM,EAClC,MACJ,CACJ,CAEA,MAAMp2B,EAASP,EAAQC,CAAC,EACpBM,aAAkB,SAClB,MAAMA,CAEd,QAAC,CACG,KAAK,aAAe,EACxB,EACJ,EAEA,YAAK,eAAe,KAAKm2B,CAAc,EACvC,KAAK,KAAK,iBAAiB,SAAUA,CAAc,EAE5C,IAAM,CACT,MAAMtzB,EAAQ,KAAK,eAAe,QAAQszB,CAAc,EACpDtzB,EAAQ,KACR,KAAK,eAAe,OAAOA,EAAO,CAAC,EACnC,KAAK,KAAK,oBAAoB,SAAUszB,CAAc,EAE9D,CACJ,CAEA,SAASplB,EAAO,CACZ,YAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAGA,GACjC,KAAK,iBAAgB,EACd,IACX,CAEA,kBAAmB,CACf,OAAO,KAAK,KAAK,KAAK,EAAE,QAAQ7R,GAAQ,CACpC,MAAM8c,EAAQ,KAAK,KAAK,cAAc,UAAU9c,CAAI,IAAI,EACxD,GAAI,CAAC8c,EAAO,OAEZ,MAAM/K,EAAa,KAAK,MAAM/R,CAAI,EAC5Bm3B,EAAa,KAAK,eAAeplB,CAAU,EACjD+K,EAAM,aAAa,gBAAiBqa,CAAU,CAClD,CAAC,CACL,CAEA,eAAetlB,EAAO,CAClB,GAAI,OAAOA,GAAU,WACjB,MAAO,SAGX,MAAM8D,EAAQ,CAAA,EACd,cAAO,KAAK9D,CAAK,EAAE,QAAQI,GAAQ,CAC/B,MAAMjN,EAAS6M,EAAMI,CAAI,EACrB,OAAOjN,GAAW,UAAYA,IAAW,KACrCiN,IAAS,UACT0D,EAAM,KAAK,WAAW3Q,EAAO,QAAQ,QAAQ,MAAO,EAAE,CAAC,EAAE,EAClDiN,IAAS,UAChB0D,EAAM,KAAK,WAAW3Q,CAAM,EAAE,EAE9B2Q,EAAM,KAAK1D,CAAI,EAEZ,OAAOjN,GAAW,UAAY,OAAOA,GAAW,SACvD2Q,EAAM,KAAK,GAAG1D,CAAI,IAAIjN,CAAM,EAAE,EACvBA,IAAW,IAClB2Q,EAAM,KAAK1D,CAAI,CAEvB,CAAC,EACM0D,EAAM,KAAK,GAAG,CACzB,CAEA,MAAM,SAASyhB,EAAS,KAAM,CAC1B,KAAK,OAAS,GACd,MAAMC,EAAY,CAAA,EAEZ1L,EAASyL,EACT,MAAM,QAAQA,CAAM,EAAIA,EAAS,CAACA,CAAM,EACxC,KAAK,KAAK,iBAAiB,yBAAyB,EAE1D,UAAWta,KAAS6O,EAAQ,CACxB,MAAM3rB,EAAO8c,EAAM,KACnB,GAAI,CAAC9c,EAAM,SAEX,MAAM8R,EAAS,MAAM,KAAK,eAAegL,CAAK,EAC1ChL,EAAO,OAAS,IAChB,KAAK,OAAO9R,CAAI,EAAI8R,EACpBulB,EAAU,KAAK,GAAGvlB,CAAM,EAEhC,CAEA,MAAO,CACH,MAAOulB,EAAU,SAAW,EAC5B,OAAQA,EACR,YAAa,KAAK,MAClC,CACQ,CAEA,MAAM,eAAeva,EAAO,CACxB,MAAM9c,EAAO8c,EAAM,KACbjL,EAAQ,KAAK,MAAM7R,CAAI,EAE7B,GAAI,OAAO6R,GAAU,WAAY,CAC7B,MAAM/Q,EAAS+Q,EAAMiL,EAAM,MAAM,KAAI,EAAIA,CAAK,EAC9C,GAAIhc,aAAkB,QAAS,CAC3B,MAAMw2B,EAAc,MAAMx2B,EAC1B,GAAIw2B,IAAgB,GAAM,CACtB,MAAMC,EAAcza,EAAM,aAAa,YAAY,GAAKA,EAAM,aAAa,aAAa,GAAK9c,EACvFkS,EAAU,OAAOolB,GAAgB,SAAWA,EAAc,GAAGC,CAAW,QAC9E,YAAK,UAAU,UAAUza,EAAO5K,CAAO,EAChC,CAACA,CAAO,CACnB,CACJ,SAAWpR,IAAW,GAAM,CACxB,MAAMy2B,EAAcza,EAAM,aAAa,YAAY,GAAKA,EAAM,aAAa,aAAa,GAAK9c,EACvFkS,EAAU,OAAOpR,GAAW,SAAWA,EAAS,GAAGy2B,CAAW,QACpE,YAAK,UAAU,UAAUza,EAAO5K,CAAO,EAChC,CAACA,CAAO,CACnB,CACA,YAAK,UAAU,WAAW4K,CAAK,EACxB,EACX,CAGA,GAAI,CADY,MAAM,KAAK,UAAU,mBAAmBA,CAAK,EAC/C,CACV,MAAMgG,EAAehG,EAAM,eAAe,cAAc,kBAAkB,EAC1E,OAAOgG,EAAe,CAACA,EAAa,WAAW,EAAI,CAAC,mBAAmB,CAC3E,CACA,MAAO,EACX,CAEA,YAAYhR,EAAQ,CACZ,OAAO,QAAY,IACnB,QAAQ,MAAMA,EAAO,KAAK;AAAA,CAAI,CAAC,EACxB,OAAO,QAAY,KAC1B,QAAQ,MAAM,0BAA2BA,CAAM,CAEvD,CAEA,WAAY,CACR,MAAMoF,EAAS,CAAA,EAGf,OAFe,KAAK,KAAK,iBAAiB,yBAAyB,EAE5D,QAAQ4F,GAAS,CACpB,MAAM9c,EAAO8c,EAAM,KACd9c,IAED8c,EAAM,OAAS,YACV5F,EAAOlX,CAAI,IACZkX,EAAOlX,CAAI,EAAI,IAEf8c,EAAM,SACN5F,EAAOlX,CAAI,EAAE,KAAK8c,EAAM,KAAK,GAE1BA,EAAM,OAAS,QAClBA,EAAM,UACN5F,EAAOlX,CAAI,EAAI8c,EAAM,OAElBA,EAAM,OAAS,OACtB5F,EAAOlX,CAAI,EAAI8c,EAAM,MAErB5F,EAAOlX,CAAI,EAAI8c,EAAM,MAE7B,CAAC,EAEM5F,CACX,CAEA,UAAUA,EAAQ,CACd,cAAO,KAAKA,CAAM,EAAE,QAAQzV,GAAO,CAC/B,MAAMqb,EAAQ,KAAK,KAAK,cAAc,UAAUrb,CAAG,IAAI,EACvD,GAAKqb,EAEL,GAAIA,EAAM,OAAS,WAAY,CAC3B,MAAM0a,EAAc,MAAM,QAAQtgB,EAAOzV,CAAG,CAAC,EAAIyV,EAAOzV,CAAG,EAAI,CAACyV,EAAOzV,CAAG,CAAC,EAC3Eqb,EAAM,QAAU0a,EAAY,SAAS1a,EAAM,KAAK,CACpD,SAAWA,EAAM,OAAS,QAAS,CAC/B,MAAM2a,EAAQ,KAAK,KAAK,cAAc,UAAUh2B,CAAG,aAAayV,EAAOzV,CAAG,CAAC,IAAI,EAC3Eg2B,IAAOA,EAAM,QAAU,GAC/B,SAAW3a,EAAM,OAAS,OAAQ,CAC9B,MAAM4a,EAAe,IAAI,aACrBxgB,EAAOzV,CAAG,YAAa,UACvB,MAAM,KAAKyV,EAAOzV,CAAG,CAAC,EAAE,QAAQ8E,GAAQ,CACpCmxB,EAAa,MAAM,IAAInxB,CAAI,CAC/B,CAAC,EAELuW,EAAM,MAAQ4a,EAAa,KAC/B,MACI5a,EAAM,MAAQ5F,EAAOzV,CAAG,CAEhC,CAAC,EACM,IACX,CAEA,OAAQ,CACJ,YAAK,KAAK,QACV,KAAK,OAAS,GACd,KAAK,UAAU,UAAU,KAAK,IAAI,EAC3B,IACX,CAEA,aAAc,CACV,YAAK,OAAS,GACd,KAAK,KAAK,iBAAiB,kBAAkB,EAAE,QAAQqb,GAAS,CAC5D,KAAK,UAAU,WAAWA,CAAK,CACnC,CAAC,EACM,IACX,CAEA,SAAS6a,EAAW,CAChB,OAAO,KAAK,OAAOA,CAAS,GAAK,CAAA,CACrC,CAEA,SAASA,EAAW,CAChB,OAAO,KAAK,OAAOA,CAAS,GAAK,KAAK,OAAOA,CAAS,EAAE,OAAS,CACrE,CAEA,SAAU,CACN,KAAK,eAAe,QAAQp3B,GAAW,CACnC,KAAK,KAAK,oBAAoB,SAAUA,CAAO,CACnD,CAAC,EACD,KAAK,eAAiB,GACtB,KAAK,OAAS,GACd,KAAK,MAAQ,EACjB,CACR,CAEI,SAASq3B,EAAQZ,EAAgBj0B,EAAU,GAAI,CAC3C,OAAO,IAAIg0B,EAAWC,EAAgBj0B,CAAO,CACjD,CAEA,SAAS80B,EAAWb,EAAgBj0B,EAAU,GAAI,CAC9C,OAAO,IAAIg0B,EAAWC,EAAgBj0B,CAAO,CACjD,CAEAsyB,EAAO,WAAa0B,EACpB1B,EAAO,QAAUuC,EACjBvC,EAAO,WAAawC,CACxB,EAAG,MAAM,EClST,IAAAC,GAAA,KAAsB,CACpB,OAAO,cAAc1J,EAAM,CACzB,MAAMpqB,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAYoqB,EACfpqB,EAAU,iBACnB,CAEA,OAAO,eAAezB,EAAgBzC,EAAQ,CAAA,EAAIsuB,EAAO,GAAI,CAC3D,MAAMvuB,EAAU,KAAK,cAAcuuB,CAAI,EACjC9pB,EAAY,IAAI/B,EAAe1C,CAAO,EAC5C,cAAO,OAAOyE,EAAU,MAAOxE,CAAK,EAC7B,CAAE,UAAAwE,EAAW,QAAAzE,EACtB,CAEA,aAAa,QAAQk4B,EAAW1yB,EAAU,IAAM,CAC9C,MAAMqE,EAAY,KAAK,MACvB,OAAO,IAAI,QAAQ,CAACjF,EAASwB,IAAW,CACtC,MAAM+xB,EAAQ,SAAY,CACxB,GAAI,CACF,MAAMl3B,EAAS,MAAMi3B,IACjBj3B,EACF2D,EAAQ3D,CAAM,EACL,KAAK,IAAG,EAAK4I,EAAYrE,EAClC,sBAAsB2yB,CAAK,EAE3B/xB,EAAO,IAAI,MAAM,iBAAiB,CAAC,CAEvC,MAAgB,CACV,KAAK,MAAQyD,EAAYrE,EAC3B,sBAAsB2yB,CAAK,EAE3B/xB,EAAO,IAAI,MAAM,iBAAiB,CAAC,CAEvC,CACF,EACA,sBAAsB+xB,CAAK,CAC7B,CAAC,CACH,CAEA,aAAa,eAAe7vB,EAAUyO,EAAS,SAAUvR,EAAU,IAAM,CACvE,OAAO,KAAK,QAAQ,IAAMuR,EAAO,cAAczO,CAAQ,EAAG9C,CAAO,CACnE,CAEA,aAAa,YAAY0S,EAAMnB,EAAS,SAAUvR,EAAU,IAAM,CAChE,OAAO,KAAK,QAAQ,IAAMuR,EAAO,YAAY,SAASmB,CAAI,EAAG1S,CAAO,CACtE,CAEA,OAAO,UAAUxF,EAASQ,EAAW43B,EAAS,CAAA,EAAI,CAChD,MAAM/Y,EAAQ,IAAI,YAAY7e,EAAW,CACvC,QAAS,GACT,WAAY,GACZ,OAAA43B,CACN,CAAK,EACDp4B,EAAQ,cAAcqf,CAAK,CAC7B,CAEA,OAAO,UAAUrf,EAASI,EAAO,CAC/BJ,EAAQ,MAAQI,EAChB,KAAK,UAAUJ,EAAS,OAAO,EAC/B,KAAK,UAAUA,EAAS,QAAQ,CAClC,CAEA,OAAO,UAAUA,EAAS,CACxB,KAAK,UAAUA,EAAS,OAAO,CACjC,CAEA,OAAO,YAAYA,EAAS4B,EAAK,CAC/B,MAAMyd,EAAQ,IAAI,cAAc,UAAW,CAAE,IAAAzd,EAAK,QAAS,EAAI,CAAE,EACjE5B,EAAQ,cAAcqf,CAAK,CAC7B,CAEA,aAAa,UAAW,CACtB,OAAO,IAAI,QAAQza,GAAW,sBAAsBA,CAAO,CAAC,CAC9D,CAEA,OAAO,SAASoK,EAAM,CACpB,MAAMqpB,EAAc,KAAK,IACnBC,EAAe,KAErB,YAAK,IAAM,IAAMtpB,EAAK,QAAO,EAC7B,WAAW,KAAO,cAAc,IAAK,CACnC,eAAelN,EAAM,CAEnB,OADA,MAAM,GAAGA,CAAI,EACTA,EAAK,SAAW,EACX,IAAI,KAAKkN,CAAI,EAEf,IAAIspB,EAAa,GAAGx2B,CAAI,CACjC,CACN,EAEW,IAAM,CACX,KAAK,IAAMu2B,EACX,WAAW,KAAOC,CACpB,CACF,CAEA,OAAO,UAAUC,EAAe,CAC9B,MAAM5H,EAAgB,MAEtB,kBAAW,MAAQ,KAAK,GAAG,MAAOzsB,EAAKhB,IAAY,CACjD,UAAWs1B,KAAQD,EAOjB,GANI,OAAOC,EAAK,KAAQ,UAAYt0B,IAAQs0B,EAAK,KAG7CA,EAAK,eAAe,QAAUA,EAAK,IAAI,KAAKt0B,CAAG,GAG/Cs0B,EAAK,QAAUt1B,GAAWA,EAAQ,SAAWs1B,EAAK,OACpD,OAAOA,EAAK,WAGhB,OAAO7H,EAAczsB,EAAKhB,CAAO,CACnC,CAAC,EAEM,IAAM,CACX,WAAW,MAAQytB,CACrB,CACF,CAEA,aAAa,aAAajuB,EAAgBzC,EAAQ,CAAA,EAAIsuB,EAAO,GAAI,CAC/D,KAAM,CAAE,UAAA9pB,EAAW,QAAAzE,GAAY,KAAK,eAAe0C,EAAgBzC,EAAOsuB,CAAI,EAC9E,aAAM9pB,EAAU,QAChB,MAAM,KAAK,WACJ,CAAE,UAAAA,EAAW,QAAAzE,EACtB,CAEA,aAAa,eAAeyE,EAAW,CACrC,MAAMA,EAAU,UAChB,MAAM,KAAK,UACb,CAEA,OAAO,UAAUsS,EAAQmB,EAAM,CAC7B,MAAM5V,EAAWyU,EAAO,iBAAiB,GAAG,EAC5C,UAAW/W,KAAWsC,EACpB,GAAItC,EAAQ,YAAY,KAAI,IAAOkY,EACjC,OAAOlY,EAGX,MAAM,IAAI,MAAM,sBAAsBkY,CAAI,aAAa,CACzD,CAEA,OAAO,YAAYnB,EAAQmB,EAAM,CAC/B,MAAM5V,EAAWyU,EAAO,iBAAiB,GAAG,EAC5C,UAAW/W,KAAWsC,EACpB,GAAItC,EAAQ,YAAY,KAAI,IAAOkY,EACjC,OAAOlY,EAGX,OAAO,IACT,CAEA,OAAO,YAAY+W,EAAQ0hB,EAAQ,CACjC,MAAMz4B,EAAU+W,EAAO,cAAc,iBAAiB0hB,CAAM,IAAI,EAChE,GAAI,CAACz4B,EACH,MAAM,IAAI,MAAM,6BAA6By4B,CAAM,aAAa,EAElE,OAAOz4B,CACT,CAEA,OAAO,cAAc+W,EAAQ0hB,EAAQ,CACnC,OAAO1hB,EAAO,cAAc,iBAAiB0hB,CAAM,IAAI,CACzD,CAEA,OAAO,UAAU1hB,EAAQ2hB,EAAM,CAC7B,MAAM14B,EAAU+W,EAAO,cAAc,UAAU2hB,CAAI,IAAI,EACvD,GAAI,CAAC14B,EACH,MAAM,IAAI,MAAM,sBAAsB04B,CAAI,aAAa,EAEzD,OAAO14B,CACT,CAEA,OAAO,YAAY+W,EAAQ2hB,EAAM,CAC/B,OAAO3hB,EAAO,cAAc,UAAU2hB,CAAI,IAAI,CAChD,CAEA,aAAa,aAAa14B,EAASsxB,EAAQC,EAAQoH,EAAMC,EAAM,CAC7D,KAAK,UAAU54B,EAAS,YAAa,CACnC,QAASsxB,EACT,QAASC,CACf,CAAK,EAED,KAAK,UAAUvxB,EAAS,OAAQ,CAC9B,SAAUsxB,EAASqH,GAAQ,EAC3B,SAAUpH,EAASqH,GAAQ,CACjC,CAAK,EAED,KAAK,UAAU54B,EAAS,UAAW,CACjC,QAAS24B,EACT,QAASC,CACf,CAAK,CACH,CAEA,aAAa,cAAc54B,EAASsxB,EAAQC,EAAQoH,EAAMC,EAAM,CAC9D,MAAMC,EAAa,IAAI,WAAW,aAAc,CAC9C,QAAS,CAAC,CAAE,QAASvH,EAAQ,QAASC,CAAM,CAAE,EAC9C,QAAS,EACf,CAAK,EACDvxB,EAAQ,cAAc64B,CAAU,EAEhC,MAAMC,EAAY,IAAI,WAAW,YAAa,CAC5C,QAAS,CAAC,CAAE,SAAUxH,EAASqH,GAAQ,EAAG,SAAUpH,EAASqH,GAAQ,CAAC,CAAE,EACxE,QAAS,EACf,CAAK,EACD54B,EAAQ,cAAc84B,CAAS,EAE/B,MAAMC,EAAW,IAAI,WAAW,WAAY,CAC1C,QAAS,CAAC,CAAE,QAASJ,EAAM,QAASC,CAAI,CAAE,EAC1C,QAAS,EACf,CAAK,EACD54B,EAAQ,cAAc+4B,CAAQ,CAChC,CAEA,aAAa,aAAat0B,EAAWu0B,EAAUC,EAAe,CAC5D,OAAO,KAAK,QAAQ,IACXx0B,EAAU,MAAMu0B,CAAQ,IAAMC,CACtC,CACH,CAEA,aAAa,aAAax0B,EAAWy0B,EAASD,EAAe,CAC3D,OAAO,KAAK,QAAQ,IACXx0B,EAAU,MAAMy0B,CAAO,IAAMD,CACrC,CACH,CAEA,aAAa,eAAex0B,EAAWjE,EAAW,CAChD,OAAO,KAAK,QAAQ,IACXiE,EAAU,UAAYA,EAAU,SAASjE,CAAS,CAC1D,CACH,CAEA,OAAO,MAAMkN,EAAKrM,EAAY,CAC5B,MAAMQ,EAAW6L,EAAIrM,CAAU,EACzB83B,EAAM,YAAYr3B,EAAM,CAC5B,OAAAq3B,EAAI,OAAS,GACbA,EAAI,WAAaA,EAAI,WAAa,GAAK,EACvCA,EAAI,MAAQA,EAAI,MAAQ,CAAA,GAAI,OAAO,CAACr3B,CAAI,CAAC,EAClCD,EAAS,MAAM,KAAMC,CAAI,CAClC,EACA,OAAA4L,EAAIrM,CAAU,EAAI83B,EACX,IAAM,CACXzrB,EAAIrM,CAAU,EAAIQ,CACpB,CACF,CAEA,aAAa,eAAgB,CAC3B,OAAO,IAAI,QAAQ+C,GAAW,aAAaA,CAAO,CAAC,CACrD,CACF,EAEA,OAAO,gBAAkBw0B,GACzB,OAAO,UAAYA,GC1PnB,IAAAC,GAAA,KAAiB,CACf,YAAYn2B,EAAU,GAAI,CACxB,KAAK,QAAUA,EAAQ,SAAW,CAAA,EAClC,KAAK,cAAgBA,EAAQ,eAAiB,QAC9C,KAAK,eAAiBA,EAAQ,gBAAkB,QAChD,KAAK,UAAYA,EAAQ,WAAa,IACtC,KAAK,eAAiBA,EAAQ,iBAAoBtB,IAChD,QAAQ,KAAK,wBAAwBA,CAAG,EAAE,EACnCA,IAGT,KAAK,aAAY,CACnB,CAEA,cAAe,CACM,SAAS,iBAAiB,mDAAmD,EACrF,QAAQyT,GAAU,CAC3B,MAAMikB,EAASjkB,EAAO,QAAQ,WAC9B,GAAIikB,EACF,GAAI,CACF,MAAM74B,EAAO,KAAK,MAAM4U,EAAO,WAAW,EAC1C,KAAK,UAAUikB,EAAQ74B,CAAI,CAC7B,OAASE,EAAG,CACV,QAAQ,MAAM,6BAA8BA,CAAC,CAC/C,CAEJ,CAAC,EAED,MAAM44B,EAAW,SAAS,gBAAgB,KACtCA,GAAY,KAAK,QAAQA,CAAQ,IACnC,KAAK,cAAgBA,EAEzB,CAEA,UAAUD,EAAQ74B,EAAM,CACjB,KAAK,QAAQ64B,CAAM,IACtB,KAAK,QAAQA,CAAM,EAAI,IAEzB,KAAK,WAAW,KAAK,QAAQA,CAAM,EAAG74B,CAAI,CAC5C,CAEA,WAAW2V,EAAQ0f,EAAQ,CACzB,UAAWl0B,KAAO,OAAO,KAAKk0B,CAAM,EAC9BA,EAAOl0B,CAAG,YAAa,QAAUA,KAAOwU,EAC1C,KAAK,WAAWA,EAAOxU,CAAG,EAAGk0B,EAAOl0B,CAAG,CAAC,EAExCwU,EAAOxU,CAAG,EAAIk0B,EAAOl0B,CAAG,CAG9B,CAEA,UAAU03B,EAAQ,CAChB,OAAI,KAAK,QAAQA,CAAM,GACrB,KAAK,cAAgBA,EACrB,SAAS,gBAAgB,KAAOA,EAChC,KAAK,YAAW,EACT,IAEF,EACT,CAEA,WAAY,CACV,OAAO,KAAK,aACd,CAEA,EAAE13B,EAAKiC,EAAS,GAAI,CAClB,IAAIzD,EAAQ,KAAK,gBAAgBwB,EAAK,KAAK,aAAa,EAMxD,OAJKxB,IACHA,EAAQ,KAAK,gBAAgBwB,EAAK,KAAK,cAAc,GAGlDxB,EAIE,KAAK,aAAaA,EAAOyD,CAAM,EAH7B,KAAK,eAAejC,CAAG,CAIlC,CAEA,gBAAgBA,EAAK03B,EAAQ,CAC3B,GAAI,CAAC,KAAK,QAAQA,CAAM,EAAG,OAAO,KAElC,MAAM1rB,EAAOhM,EAAI,MAAM,KAAK,SAAS,EACrC,IAAIxB,EAAQ,KAAK,QAAQk5B,CAAM,EAE/B,UAAWziB,KAAKjJ,EACd,GAAIxN,GAAS,OAAOA,GAAU,UAAYyW,KAAKzW,EAC7CA,EAAQA,EAAMyW,CAAC,MAEf,QAAO,KAIX,OAAO,OAAOzW,GAAU,SAAWA,EAAQ,IAC7C,CAEA,aAAakL,EAAKzH,EAAQ,CACxB,OAAOyH,EAAI,QAAQ,aAAc,CAAC1H,EAAOhC,IAChCiC,EAAOjC,CAAG,IAAM,OAAYiC,EAAOjC,CAAG,EAAIgC,CAClD,CACH,CAEA,EAAEhC,EAAK2tB,EAAO1rB,EAAS,CAAA,EAAI,CACzB,MAAMzD,EAAQ,KAAK,EAAEwB,EAAK,CAAE,GAAGiC,EAAQ,MAAA0rB,CAAK,CAAE,EAE9C,GAAI,CAACnvB,EAAO,OAAOA,EAEnB,MAAM0V,EAAQ1V,EAAM,MAAM,GAAG,EAE7B,OAAI0V,EAAM,SAAW,EACZ1V,EAAM,QAAQ,UAAWmvB,CAAK,EAGnCzZ,EAAM,SAAW,EACZyZ,IAAU,EAAIzZ,EAAM,CAAC,EAAIA,EAAM,CAAC,EAGrCA,EAAM,QAAU,EACdyZ,IAAU,EAAUzZ,EAAM,CAAC,EAC3ByZ,IAAU,EAAUzZ,EAAM,CAAC,EACxBA,EAAM,CAAC,EAGT1V,CACT,CAEA,aAAc,CACZ,MAAMif,EAAQ,IAAI,YAAY,qBAAsB,CAClD,OAAQ,CAAE,OAAQ,KAAK,aAAa,EACpC,QAAS,EACf,CAAK,EACD,SAAS,cAAcA,CAAK,CAC9B,CAEA,MAAM,WAAWia,EAAQp1B,EAAK,CAC5B,GAAI,CAEF,MAAMzD,EAAO,MADI,MAAM,MAAMyD,CAAG,GACJ,OAC5B,YAAK,UAAUo1B,EAAQ74B,CAAI,EACpB,EACT,OAASM,EAAO,CACd,eAAQ,MAAM,yBAA0BA,CAAK,EACtC,EACT,CACF,CAEA,qBAAsB,CACpB,OAAO,OAAO,KAAK,KAAK,OAAO,CACjC,CAEA,UAAUu4B,EAAQ,CAChB,MAAO,CAAC,CAAC,KAAK,QAAQA,CAAM,CAC9B,CAEA,WAAWtqB,EAAM9L,EAAU,GAAI,CAC7B,MAAMo2B,EAASp2B,EAAQ,QAAU,KAAK,cAChCs2B,EAAU,OAAOxqB,GAAS,SAAW,IAAI,KAAKA,CAAI,EAAIA,EAE5D,OAAO,IAAI,KAAK,eAAesqB,EAAQp2B,CAAO,EAAE,OAAOs2B,CAAO,CAChE,CAEA,aAAaC,EAAQv2B,EAAU,GAAI,CACjC,MAAMo2B,EAASp2B,EAAQ,QAAU,KAAK,cAEtC,OAAO,IAAI,KAAK,aAAao2B,EAAQp2B,CAAO,EAAE,OAAOu2B,CAAM,CAC7D,CAEA,eAAeA,EAAQ7qB,EAAU1L,EAAU,CAAA,EAAI,CAC7C,MAAMo2B,EAASp2B,EAAQ,QAAU,KAAK,cAEtC,OAAO,IAAI,KAAK,aAAao2B,EAAQ,CACnC,MAAO,WACP,SAAA1qB,EACA,GAAG1L,CACT,CAAK,EAAE,OAAOu2B,CAAM,CAClB,CAEA,mBAAmBr5B,EAAOs5B,EAAMx2B,EAAU,CAAA,EAAI,CAC5C,MAAMo2B,EAASp2B,EAAQ,QAAU,KAAK,cAEtC,OAAO,IAAI,KAAK,mBAAmBo2B,EAAQp2B,CAAO,EAAE,OAAO9C,EAAOs5B,CAAI,CACxE,CACF,EAEA,MAAMC,EAAa,IAAIC,GAEvB,SAASC,GAAW32B,EAAS,CAC3B,OAAO,IAAI02B,GAAW12B,CAAO,CAC/B,CAEA,SAASuf,GAAE7gB,EAAKiC,EAAS,GAAI,CAC3B,OAAO81B,EAAW,EAAE/3B,EAAKiC,CAAM,CACjC,CAEA,SAASoS,GAAErU,EAAK2tB,EAAO1rB,EAAS,CAAA,EAAI,CAClC,OAAO81B,EAAW,EAAE/3B,EAAK2tB,EAAO1rB,CAAM,CACxC,CAEA,SAASi2B,GAAUR,EAAQ,CACzB,OAAOK,EAAW,UAAUL,CAAM,CACpC,CAEA,SAASS,IAAY,CACnB,OAAOJ,EAAW,WACpB,CAEA,SAASK,GAAWhrB,EAAM9L,EAAU,GAAI,CACtC,OAAOy2B,EAAW,WAAW3qB,EAAM9L,CAAO,CAC5C,CAEA,SAAS+2B,GAAaR,EAAQv2B,EAAU,GAAI,CAC1C,OAAOy2B,EAAW,aAAaF,EAAQv2B,CAAO,CAChD,CAEA,SAASg3B,GAAeT,EAAQ7qB,EAAU1L,EAAU,CAAA,EAAI,CACtD,OAAOy2B,EAAW,eAAeF,EAAQ7qB,EAAU1L,CAAO,CAC5D,CAEA,OAAO,WAAa02B,GACpB,OAAO,WAAaD,EACpB,OAAO,WAAaE,GACpB,OAAO,EAAIpX,GACX,OAAO,EAAIxM,GACX,OAAO,UAAY6jB,GACnB,OAAO,UAAYC,GACnB,OAAO,WAAaC,GACpB,OAAO,aAAeC,GACtB,OAAO,eAAiBC,GCnOxB,IAAAC,GAAA,KAAyB,CACvB,aAAc,CACZ,KAAK,UAAY,IAAI,IACrB,KAAK,OAAS,IAAI,GACpB,CAEA,GAAG/jB,EAAQgkB,EAAW15B,EAASwC,EAAU,CAAA,EAAI,CAC3C,MAAMtB,EAAM,KAAK,QAAQwU,EAAQgkB,CAAS,EAErC,KAAK,UAAU,IAAIx4B,CAAG,GACzB,KAAK,UAAU,IAAIA,EAAK,CAAA,CAAE,EAG5B,MAAMy4B,EAAW15B,GAAM,CACjBD,EAAQ,QAAU,OAAOA,EAAQ,QAAW,YAC9CA,EAAQ,OAAOC,CAAC,EAGlB,MAAMM,EAASP,EAAQC,CAAC,EAExB,OAAID,EAAQ,OAAS,OAAOA,EAAQ,OAAU,YAC5CA,EAAQ,MAAMC,EAAGM,CAAM,EAGlBA,CACT,EAEMmY,EAAW,CACf,QAAA1Y,EACA,QAAA25B,EACA,QAAAn3B,EACA,OAAQ,EACd,EAEI,KAAK,UAAU,IAAItB,CAAG,EAAE,KAAKwX,CAAQ,EAEjClW,EAAQ,QACL,KAAK,OAAO,IAAIA,EAAQ,KAAK,GAChC,KAAK,OAAO,IAAIA,EAAQ,MAAO,CAAA,CAAE,EAEnC,KAAK,OAAO,IAAIA,EAAQ,KAAK,EAAE,KAAK,CAAE,OAAAkT,EAAQ,UAAAgkB,EAAW,QAAA15B,EAAS,QAAA25B,CAAO,CAAE,GAG7EjkB,EAAO,iBAAiBgkB,EAAWC,EAASn3B,CAAO,EAEnD,MAAM8H,EAAc,IAAM,CAExB,GADAoL,EAAO,oBAAoBgkB,EAAWC,EAASn3B,CAAO,EAClD,KAAK,UAAU,IAAItB,CAAG,EAAG,CAC3B,MAAM04B,EAAO,KAAK,UAAU,IAAI14B,CAAG,EAC7B24B,EAAMD,EAAK,QAAQlhB,CAAQ,EAC7BmhB,IAAQ,IACVD,EAAK,OAAOC,EAAK,CAAC,CAEtB,CACA,GAAIr3B,EAAQ,OAAS,KAAK,OAAO,IAAIA,EAAQ,KAAK,EAAG,CACnD,MAAMs3B,EAAY,KAAK,OAAO,IAAIt3B,EAAQ,KAAK,EACzCq3B,EAAMC,EAAU,UACpBC,GAAKA,EAAE,SAAWrkB,GAAUqkB,EAAE,YAAcL,GAAaK,EAAE,UAAY/5B,CACjF,EACY65B,IAAQ,IACVC,EAAU,OAAOD,EAAK,CAAC,CAE3B,CACAnhB,EAAS,OAAS,EACpB,EAEA,OAAAA,EAAS,YAAcpO,EAEhBoO,CACT,CAEA,IAAIhD,EAAQgkB,EAAW15B,EAAS,CAC9B,MAAMkB,EAAM,KAAK,QAAQwU,EAAQgkB,CAAS,EAE1C,GAAI,CAAC,KAAK,UAAU,IAAIx4B,CAAG,EAAG,OAE9B,MAAM84B,EAAe,KAAK,UAAU,IAAI94B,CAAG,EACrCkC,EAAQ42B,EAAa,UAAUC,GAAKA,EAAE,UAAYj6B,CAAO,EAE/D,GAAIoD,IAAU,GAAI,CAChB,MAAMsV,EAAWshB,EAAa52B,CAAK,EACnCsS,EAAO,oBAAoBgkB,EAAWhhB,EAAS,QAASA,EAAS,OAAO,EACxEA,EAAS,OAAS,GAClBshB,EAAa,OAAO52B,EAAO,CAAC,EAExBsV,EAAS,QAAQ,OACnB,KAAK,iBAAiBA,EAAS,QAAQ,MAAOhD,EAAQgkB,EAAW15B,CAAO,CAE5E,CACF,CAEA,KAAK0V,EAAQgkB,EAAW15B,EAASwC,EAAU,CAAA,EAAI,CAC7C,MAAM03B,EAAej6B,IACnB,KAAK,IAAIyV,EAAQgkB,EAAWQ,CAAW,EAChCl6B,EAAQC,CAAC,GAGlB,OAAO,KAAK,GAAGyV,EAAQgkB,EAAWQ,EAAa13B,CAAO,CACxD,CAEA,WAAW8F,EAAO,CAChB,GAAI,CAAC,KAAK,OAAO,IAAIA,CAAK,EAAG,OAEN,KAAK,OAAO,IAAIA,CAAK,EAE7B,QAAQ,CAAC,CAAE,OAAAoN,EAAQ,UAAAgkB,EAAW,QAAA15B,EAAS,QAAA25B,KAAc,CAClEjkB,EAAO,oBAAoBgkB,EAAWC,CAAO,EAE7C,MAAMz4B,EAAM,KAAK,QAAQwU,EAAQgkB,CAAS,EAC1C,GAAI,KAAK,UAAU,IAAIx4B,CAAG,EAAG,CAC3B,MAAM84B,EAAe,KAAK,UAAU,IAAI94B,CAAG,EACrCkC,EAAQ42B,EAAa,UAAUC,GAAKA,EAAE,UAAYj6B,CAAO,EAC3DoD,IAAU,KACZ42B,EAAa52B,CAAK,EAAE,OAAS,GAC7B42B,EAAa,OAAO52B,EAAO,CAAC,EAEhC,CACF,CAAC,EAED,KAAK,OAAO,OAAOkF,CAAK,CAC1B,CAEA,iBAAiBA,EAAOoN,EAAQgkB,EAAW15B,EAAS,CAClD,GAAI,CAAC,KAAK,OAAO,IAAIsI,CAAK,EAAG,OAE7B,MAAM6xB,EAAiB,KAAK,OAAO,IAAI7xB,CAAK,EACtClF,EAAQ+2B,EAAe,UAC3BF,GAAKA,EAAE,SAAWvkB,GAAUukB,EAAE,YAAcP,GAAaO,EAAE,UAAYj6B,CAC7E,EAEQoD,IAAU,IACZ+2B,EAAe,OAAO/2B,EAAO,CAAC,CAElC,CAEA,QAAQsS,EAAQgkB,EAAW,CAOzB,MAAO,GANYhkB,IAAW,SAAW,WACtBA,IAAW,OAAS,SACpBA,IAAW,SAAS,KAAO,OAC3BA,EAAO,SAAWA,EAAO,SACzB,SAEC,IAAIgkB,CAAS,EACnC,CAEA,iBAAiBhkB,EAAQgkB,EAAW,CAClC,MAAMx4B,EAAM,KAAK,QAAQwU,EAAQgkB,CAAS,EAC1C,OAAO,KAAK,UAAU,IAAIx4B,CAAG,EAAI,KAAK,UAAU,IAAIA,CAAG,EAAE,OAAS,CACpE,CAEA,sBAAuB,CACrB,MAAMk5B,EAAS,CAAA,EACf,YAAK,UAAU,QAAQ,CAACC,EAAWn5B,IAAQ,CACzCk5B,EAAOl5B,CAAG,EAAIm5B,EAAU,OAAOJ,GAAKA,EAAE,MAAM,EAAE,MAChD,CAAC,EACMG,CACT,CAEA,SAAU,CACR,KAAK,UAAU,QAAQ,CAACJ,EAAc94B,IAAQ,CAC5C,KAAM,CAACo5B,EAAYZ,CAAS,EAAIx4B,EAAI,MAAM,GAAG,EAC7C,IAAIwU,EAEA4kB,IAAe,WAAY5kB,EAAS,SAC/B4kB,IAAe,SAAU5kB,EAAS,OAClC4kB,IAAe,SAAQ5kB,EAAS,SAAS,MAE9CA,GACFskB,EAAa,QAAQthB,GAAY,CAC/BhD,EAAO,oBAAoBgkB,EAAWhhB,EAAS,QAASA,EAAS,OAAO,CAC1E,CAAC,CAEL,CAAC,EAED,KAAK,UAAU,QACf,KAAK,OAAO,OACd,CACF,EAEA,MAAM6hB,EAAe,IAAIC,GAEzB,SAASC,GAAG/kB,EAAQgkB,EAAW15B,EAASwC,EAAS,CAC/C,OAAO+3B,EAAa,GAAG7kB,EAAQgkB,EAAW15B,EAASwC,CAAO,CAC5D,CAEA,SAASk4B,GAAIhlB,EAAQgkB,EAAW15B,EAAS,CACvCu6B,EAAa,IAAI7kB,EAAQgkB,EAAW15B,CAAO,CAC7C,CAEA,SAAS26B,GAAKjlB,EAAQgkB,EAAW15B,EAASwC,EAAS,CACjD,OAAO+3B,EAAa,KAAK7kB,EAAQgkB,EAAW15B,EAASwC,CAAO,CAC9D,CAEA,SAASo4B,GAAWtyB,EAAO,CACzBiyB,EAAa,WAAWjyB,CAAK,CAC/B,CAEA,OAAO,mBAAqBkyB,GAC5B,OAAO,aAAeD,EACtB,OAAO,GAAKE,GACZ,OAAO,IAAMC,GACb,OAAO,KAAOC,GACd,OAAO,WAAaC,GC1MpB,IAAAC,GAAA,KAAqB,CACnB,aAAc,CACZ,KAAK,UAAY,KACjB,KAAK,WAAa,EACpB,CAEA,MAAO,CACL,KAAK,UAAS,EACd,KAAK,SAAQ,CACf,CAEA,WAAY,CACV,MAAMC,EAAU,SAAS,cAAc,yBAAyB,EAC5DA,IACF,KAAK,UAAYA,EAAQ,aAAa,SAAS,EAEnD,CAEA,UAAW,CACO,SAAS,cAAc,4CAA4C,IAEjF,KAAK,WAAa,GAEtB,CAEA,cAAe,CACb,OAAO,KAAK,SACd,CAEA,aAAa7zB,EAAO,CAClB,KAAK,UAAYA,EACjB,MAAM6zB,EAAU,SAAS,cAAc,yBAAyB,EAC5DA,GACFA,EAAQ,aAAa,UAAW7zB,CAAK,CAEzC,CAEA,cAAcxC,EAAQ,CACpB,OAAI,KAAK,YACPA,EAAO,QAAUA,EAAO,SAAW,CAAA,EACnCA,EAAO,QAAQ,cAAc,EAAI,KAAK,WAEjCA,CACT,CAEA,WAAWmG,EAAK,CACd,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,OAAOA,EAC5C,MAAMU,EAAM,SAAS,cAAc,KAAK,EACxC,OAAAA,EAAI,YAAcV,EACXU,EAAI,SACb,CAEA,SAASuiB,EAAM,CACb,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,OAAOA,EAE9C,MAAMkN,EAAc,CAClB,IAAK,SAAU,IAAK,KAAM,IAAK,IAAK,SAAU,MAAO,MACrD,IAAK,KAAM,IAAK,OAAQ,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAC7D,KAAM,KAAM,KAAM,QAAS,QAAS,QAAS,KAAM,KAAM,KACzD,MAAO,QAAS,QAAS,QAC/B,EAEUC,EAAoB,CACxB,OAAQ,MAAO,MAAO,QAAS,QAAS,KAAM,SAC9C,QAAS,SAAU,cAAe,iBACxC,EAEUC,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAYpN,EAEpB,MAAMqN,EAAQ94B,GAAS,CACrB,GAAIA,EAAK,WAAa,KAAK,aAAc,CACvC,MAAM+4B,EAAU/4B,EAAK,QAAQ,YAAW,EACxC,GAAI,CAAC24B,EAAY,SAASI,CAAO,EAAG,CAClC/4B,EAAK,WAAW,aAAa,SAAS,eAAeA,EAAK,WAAW,EAAGA,CAAI,EAC5E,MACF,CAEA,MAAM,KAAKA,EAAK,UAAU,EAAE,QAAQ5C,GAAQ,CAC1C,MAAM47B,EAAW57B,EAAK,KAAK,YAAW,EACpBw7B,EAAkB,SAASI,CAAQ,GACpCA,EAAS,WAAW,OAAO,GAIjCA,IAAa,QAAUA,IAAa,SACxC,KAAK,WAAW57B,EAAK,KAAK,GAC7B4C,EAAK,gBAAgB5C,EAAK,IAAI,GAHhC4C,EAAK,gBAAgB5C,EAAK,IAAI,CAMlC,CAAC,CACH,CAEA,QAASgH,EAAIpE,EAAK,WAAW,OAAS,EAAGoE,GAAK,EAAGA,IAC/C00B,EAAK94B,EAAK,WAAWoE,CAAC,CAAC,CAE3B,EAEA,OAAA00B,EAAKD,CAAO,EACLA,EAAQ,SACjB,CAEA,WAAWz3B,EAAK,CACd,GAAI,CACF,MAAMoU,EAAS,IAAI,IAAIpU,CAAG,EAE1B,MADsB,CAAC,QAAS,SAAU,QAAS,UAAW,MAAM,EAC/C,SAASoU,EAAO,QAAQ,CAC/C,MAAQ,CACN,MAAO,EACT,CACF,CAEA,cAAcyjB,EAAO,CAEnB,MADW,6BACD,KAAKA,CAAK,CACtB,CAEA,YAAY73B,EAAK,CACf,GAAI,CACF,WAAI,IAAIA,CAAG,EACJ,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEA,cAAc83B,EAAO,CAEnB,MADW,yBACD,KAAKA,EAAM,QAAQ,MAAO,EAAE,CAAC,CACzC,CAEA,mBAAmB1wB,EAAK,CACtB,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,MAAO,GAE5C,IAAI5D,EAAO,EACX,QAASR,EAAI,EAAGA,EAAIoE,EAAI,OAAQpE,IAAK,CACnC,MAAM+0B,EAAO3wB,EAAI,WAAWpE,CAAC,EAC7BQ,GAASA,GAAQ,GAAKA,EAAQu0B,EAC9Bv0B,EAAOA,EAAOA,CAChB,CACA,OAAO,KAAK,IAAIA,CAAI,EAAE,SAAS,EAAE,CACnC,CAEA,YAAY4D,EAAK,CACf,MAAI,CAACA,GAAO,OAAOA,GAAQ,SAAiB,GAExB,CAClB,+BACA,2BACA,gBACA,cACA,iBACA,kBACA,sBACA,iBACN,EAEuB,KAAKyhB,GAAWA,EAAQ,KAAKzhB,CAAG,CAAC,CACtD,CAEA,YAAYsgB,EAAM,CACVA,aAAgB,iBAEtBA,EAAK,iBAAiB,SAAW,GAAM,CACrC,MAAME,EAASF,EAAK,iBAAiB,iBAAiB,EACtD,IAAIsQ,EAAS,GAEbpQ,EAAO,QAAQ7O,GAAS,CAClB,KAAK,YAAYA,EAAM,KAAK,GAC9Bif,EAAS,GACTjf,EAAM,UAAU,IAAI,iBAAiB,GAErCA,EAAM,UAAU,OAAO,iBAAiB,CAE5C,CAAC,EAEGif,IACF,EAAE,eAAc,EAChB,QAAQ,MAAM,8CAA8C,EAEhE,CAAC,CACH,CACF,EAEA,MAAMC,GAAiB,IAAIC,GAC3B,OAAO,eAAiBD,GACxB,OAAO,eAAiBC,GC1LxB,IAAAC,GAAA,KAAyB,CACvB,aAAc,CACZ,KAAK,SAAW,IAAI,IACpB,KAAK,SAAW,GAChB,KAAK,QAAU,IACf,KAAK,cAAgB,IACvB,CAEA,MAAO,CACL,KAAK,uBAAsB,CAC7B,CAEA,wBAAyB,CACvB,OAAO,iBAAiB,QAAUhd,GAAU,CAC1C,KAAK,YAAYA,EAAM,OAASA,EAAM,QAAS,CAC7C,OAAQA,EAAM,SACd,KAAMA,EAAM,OACZ,OAAQA,EAAM,MACd,KAAM,QACd,CAAO,CACH,CAAC,EAED,OAAO,iBAAiB,qBAAuBA,GAAU,CACvD,KAAK,YAAYA,EAAM,OAAQ,CAC7B,KAAM,UACN,UAAW,EACnB,CAAO,CACH,CAAC,CACH,CAEA,iBAAiB3e,EAAS,CACpB,OAAOA,GAAY,aACrB,KAAK,cAAgBA,EAEzB,CAEA,YAAYK,EAAOu7B,EAAU,GAAI,CAC/B,MAAM96B,EAAY,KAAK,gBAAgBT,EAAOu7B,CAAO,EAKrD,GAHA,KAAK,UAAU96B,CAAS,EACxB,KAAK,gBAAgBA,CAAS,EAE1B,KAAK,cACP,GAAI,CACF,KAAK,cAAcA,CAAS,CAC9B,OAASb,EAAG,CACV,QAAQ,MAAM,gDAAiDA,CAAC,CAClE,CAGF,OAAOa,CACT,CAEA,gBAAgBT,EAAOu7B,EAAS,CAC9B,MAAM96B,EAAY,CAChB,GAAI,KAAK,YAAW,EACpB,UAAW,KAAK,IAAG,EACnB,QAAS,GACT,MAAO,GACP,KAAM86B,EAAQ,MAAQ,UACtB,OAAQA,EAAQ,QAAU,GAC1B,KAAMA,EAAQ,MAAQ,EACtB,OAAQA,EAAQ,QAAU,EAC1B,UAAWA,EAAQ,WAAa,GAChC,KAAMA,EAAQ,MAAQ,GACtB,KAAMA,EAAQ,MAAQ,CAAA,EACtB,GAAGA,CACT,EAEI,OAAIv7B,aAAiB,OACnBS,EAAU,QAAUT,EAAM,QAC1BS,EAAU,MAAQT,EAAM,OAAS,GACjCS,EAAU,KAAOT,EAAM,MACd,OAAOA,GAAU,SAC1BS,EAAU,QAAUT,EACXA,GAAS,OAAOA,GAAU,WACnCS,EAAU,QAAUT,EAAM,SAAW,KAAK,UAAUA,CAAK,EACzDS,EAAU,MAAQT,EAAM,OAAS,GACjCS,EAAU,KAAOT,EAAM,MAAQ,IAG1BS,CACT,CAEA,aAAc,CACZ,MAAO,OAAO,KAAK,IAAG,CAAE,IAAI,KAAK,OAAM,EAAG,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EACrE,CAEA,UAAUA,EAAW,CACnB,KAAK,SAAS,QAAQA,CAAS,EAC3B,KAAK,SAAS,OAAS,KAAK,SAC9B,KAAK,SAAS,MAGhB,QAAQ,MAAM,kBAAkBA,EAAU,IAAI,KAAKA,EAAU,OAAO,GAAIA,CAAS,CACnF,CAEA,gBAAgBA,EAAW,CACzB,KAAK,SAAS,QAAQ,CAACd,EAASkB,IAAQ,CACtC,GAAI,CACFlB,EAAQc,CAAS,CACnB,OAASb,EAAG,CACV,QAAQ,MAAM,0CAA0CiB,CAAG,KAAMjB,CAAC,CACpE,CACF,CAAC,CACH,CAEA,GAAGiH,EAAMlH,EAAS,CACX,KAAK,SAAS,IAAIkH,CAAI,GACzB,KAAK,SAAS,IAAIA,EAAM,CAAA,CAAE,EAE5B,KAAK,SAAS,IAAIA,CAAI,EAAE,KAAKlH,CAAO,CACtC,CAEA,IAAIkH,EAAMlH,EAAS,CACjB,GAAI,CAAC,KAAK,SAAS,IAAIkH,CAAI,EAAG,OAE9B,MAAMuB,EAAW,KAAK,SAAS,IAAIvB,CAAI,EACjC9D,EAAQqF,EAAS,QAAQzI,CAAO,EAClCoD,EAAQ,IACVqF,EAAS,OAAOrF,EAAO,CAAC,CAE5B,CAEA,aAAc,CACZ,MAAO,CAAC,GAAG,KAAK,QAAQ,CAC1B,CAEA,eAAgB,CACd,KAAK,SAAW,EAClB,CAEA,eAAgB,CACd,OAAO,KAAK,SAAS,MACvB,CAEA,eAAe8D,EAAM,CACnB,OAAO,KAAK,SAAS,OAAO20B,GAAOA,EAAI,OAAS30B,CAAI,CACtD,CAEA,cAAcwO,EAAQomB,EAAa,CAC7B,CAACpmB,GAAU,CAAComB,GAAe,CAAC,MAAM,QAAQA,CAAW,GAEzDA,EAAY,QAAQn7B,GAAc,CAChC,GAAI,OAAO+U,EAAO/U,CAAU,GAAM,WAAY,CAC5C,MAAMo7B,EAAiBrmB,EAAO/U,CAAU,EACxC+U,EAAO/U,CAAU,EAAI,YAAYS,EAAM,CACrC,GAAI,CACF,MAAMb,EAASw7B,EAAe,MAAM,KAAM36B,CAAI,EAC9C,OAAIb,aAAkB,QACbA,EAAO,MAAMF,GAAS,CAC3B27B,MAAAA,GAAmB,YAAY37B,EAAO,CACpC,KAAM,SACN,UAAWqV,EAAO,aAAa,MAAQ,GACvC,KAAM/U,EACN,KAAAS,CAClB,CAAiB,EACKf,CACR,CAAC,EAEIE,CACT,OAASF,EAAO,CACd27B,MAAAA,GAAmB,YAAY37B,EAAO,CACpC,KAAM,SACN,UAAWqV,EAAO,aAAa,MAAQ,GACvC,KAAM/U,EACN,KAAAS,CACd,CAAa,EACKf,CACR,CACF,CACF,CACF,CAAC,CACH,CACF,EAEA,MAAM27B,GAAqB,IAAIC,GAC/B,OAAO,mBAAqBD,GAC5B,OAAO,mBAAqBC,GClL5B,IAAAC,GAAA,KAAwB,CACtB,aAAc,CACZ,KAAK,QAAU,IAAI,IACnB,KAAK,OAAS,IAAI,IAClB,KAAK,UAAY,GACjB,KAAK,QAAU,GACf,KAAK,WAAa,CAChB,OAAQ,GACR,MAAO,IACP,OAAQ,GACR,KAAM,GACZ,CACE,CAEA,MAAO,CACL,KAAK,QAAU,GACf,KAAK,gBAAe,EACpB,KAAK,mBAAkB,CACzB,CAEA,iBAAkB,CAChB,GAAI,wBAAyB,OAAQ,CACnC,MAAMC,EAAgB,IAAI,oBAAqBC,GAAc,CAC3DA,EAAU,WAAU,EAAG,QAAQjW,GAAS,CACtC,KAAK,cAAc,QAAS,CAC1B,KAAMA,EAAM,KACZ,UAAWA,EAAM,UACjB,SAAUA,EAAM,QAC5B,CAAW,CACH,CAAC,CACH,CAAC,EACDgW,EAAc,QAAQ,CAAE,KAAM,QAAS,SAAU,EAAI,CAAE,EACvD,KAAK,UAAU,KAAKA,CAAa,EAEjC,MAAME,EAAmB,IAAI,oBAAqBD,GAAc,CAC9DA,EAAU,WAAU,EAAG,QAAQjW,GAAS,CACtC,KAAK,cAAc,WAAY,CAC7B,KAAMA,EAAM,KACZ,KAAMA,EAAM,cACZ,SAAUA,EAAM,SAChB,KAAMA,EAAM,aACZ,UAAWA,EAAM,SAC7B,CAAW,CACH,CAAC,CACH,CAAC,EACDkW,EAAiB,QAAQ,CAAE,KAAM,WAAY,SAAU,EAAI,CAAE,EAC7D,KAAK,UAAU,KAAKA,CAAgB,EAEpC,MAAMC,EAAmB,IAAI,oBAAqBF,GAAc,CAC9DA,EAAU,WAAU,EAAG,QAAQjW,GAAS,CACtC,KAAK,cAAc,WAAY,CAC7B,SAAUA,EAAM,SAChB,UAAWA,EAAM,SAC7B,CAAW,CACH,CAAC,CACH,CAAC,EACDmW,EAAiB,QAAQ,CAAE,KAAM,WAAY,SAAU,EAAI,CAAE,EAC7D,KAAK,UAAU,KAAKA,CAAgB,CACtC,CACF,CAEA,oBAAqB,CACnB,GAAI,gBAAiB,OAAQ,CAC3B,MAAMC,EAAM,YAAY,iBAAiB,YAAY,EAAE,CAAC,EACpDA,GACF,KAAK,cAAc,aAAc,CAC/B,iBAAkBA,EAAI,yBAA2BA,EAAI,WACrD,KAAMA,EAAI,aAAeA,EAAI,WAC7B,UAAWA,EAAI,cAAgBA,EAAI,aACnC,cAAeA,EAAI,aAC7B,CAAS,CAEL,CACF,CAEA,WAAW98B,EAAMm8B,EAAU,GAAI,CACxB,KAAK,SAEV,KAAK,OAAO,IAAIn8B,EAAM,CACpB,UAAW,YAAY,IAAG,EAC1B,QAAAm8B,CACN,CAAK,CACH,CAEA,UAAUn8B,EAAM,CACd,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAM+8B,EAAQ,KAAK,OAAO,IAAI/8B,CAAI,EAClC,GAAI,CAAC+8B,EAAO,OAAO,KAEnB,MAAMnW,EAAW,YAAY,IAAG,EAAKmW,EAAM,UAC3C,YAAK,OAAO,OAAO/8B,CAAI,EAEvB,KAAK,cAAc,QAAS,CAC1B,KAAAA,EACA,SAAA4mB,EACA,GAAGmW,EAAM,OACf,CAAK,EAEMnW,CACT,CAEA,cAAcnf,EAAMnH,EAAM,CACxB,GAAI,CAAC,KAAK,QAAS,OAEnB,MAAM08B,EAAS,CACb,KAAAv1B,EACA,UAAW,KAAK,IAAG,EACnB,GAAGnH,CACT,EAES,KAAK,QAAQ,IAAImH,CAAI,GACxB,KAAK,QAAQ,IAAIA,EAAM,CAAA,CAAE,EAE3B,KAAK,QAAQ,IAAIA,CAAI,EAAE,KAAKu1B,CAAM,CACpC,CAEA,QAAQpwB,EAAI5M,EAAMm8B,EAAU,CAAA,EAAI,CAC9B,GAAI,CAAC,KAAK,QAAS,OAAOvvB,EAAE,EAE5B,KAAK,WAAW5M,EAAMm8B,CAAO,EAE7B,IAAIr7B,EACAF,EAEJ,GAAI,CACFE,EAAS8L,EAAE,CACb,OAASpM,EAAG,CACVI,EAAQJ,CACV,CAIA,GAFiB,KAAK,UAAUR,CAAI,EAEhCY,EACF,MAAMA,EAGR,OAAOE,CACT,CAEA,aAAa8L,EAAI5M,EAAMm8B,EAAU,CAAA,EAAI,CACnC,OAAK,KAAK,SAEV,KAAK,WAAWn8B,EAAMm8B,CAAO,EAEtBvvB,EAAE,EAAG,KAAK9L,IACf,KAAK,UAAUd,CAAI,EACZc,EACR,EAAE,MAAMF,GAAS,CAChB,WAAK,UAAUZ,CAAI,EACbY,CACR,CAAC,GAVyBgM,EAAE,CAW9B,CAEA,WAAWnF,EAAM,CACf,OAAIA,EACK,KAAK,QAAQ,IAAIA,CAAI,GAAK,CAAA,EAE5B,MAAM,KAAK,KAAK,QAAQ,QAAO,CAAE,CAC1C,CAEA,YAAa,CACX,MAAMw1B,EAAU,CACd,WAAY,KACZ,MAAO,KACP,OAAQ,CAAA,EACR,UAAW,CAAA,EACX,UAAW,CAAA,CACjB,EAEI,OAAI,KAAK,QAAQ,IAAI,YAAY,IAC/BA,EAAQ,WAAa,KAAK,QAAQ,IAAI,YAAY,EAAE,CAAC,GAGnD,KAAK,QAAQ,IAAI,OAAO,IAC1BA,EAAQ,MAAQ,KAAK,QAAQ,IAAI,OAAO,GAGtC,KAAK,QAAQ,IAAI,OAAO,IAC1BA,EAAQ,OAAS,KAAK,QAAQ,IAAI,OAAO,GAGvC,KAAK,QAAQ,IAAI,UAAU,IAC7BA,EAAQ,UAAY,KAAK,QAAQ,IAAI,UAAU,GAG7C,KAAK,QAAQ,IAAI,UAAU,IAC7BA,EAAQ,UAAY,KAAK,QAAQ,IAAI,UAAU,GAG1CA,CACT,CAEA,qBAAsB,CACpB,MAAMA,EAAU,KAAK,aACrB,IAAIC,EAAQ,IAUZ,GARID,EAAQ,aACNA,EAAQ,WAAW,KAAO,IAAMC,GAAS,GACpCD,EAAQ,WAAW,KAAO,MAAMC,GAAS,IAE9CD,EAAQ,WAAW,iBAAmB,KAAMC,GAAS,GAChDD,EAAQ,WAAW,iBAAmB,MAAMC,GAAS,IAG5DD,EAAQ,MAAO,CACjB,MAAME,EAAMF,EAAQ,MAAM,KAAKpI,GAAKA,EAAE,OAAS,wBAAwB,EACnEsI,GAAOA,EAAI,UAAY,IAAMD,GAAS,GACjCC,GAAOA,EAAI,UAAY,MAAMD,GAAS,GACjD,CAEA,OAAID,EAAQ,UAAU,OAAS,IAC7BC,GAASD,EAAQ,UAAU,OAAS,IAG/B,KAAK,IAAI,EAAGC,CAAK,CAC1B,CAEA,YAAa,CACX,MAAMD,EAAU,KAAK,aACfC,EAAQ,KAAK,sBAEnB,QAAQ,MAAM,6BAA6B,EAC3C,QAAQ,IAAI,SAAUA,CAAK,EAC3B,QAAQ,IAAI,cAAeD,EAAQ,UAAU,EAC7C,QAAQ,IAAI,SAAUA,EAAQ,KAAK,EACnC,QAAQ,IAAI,cAAeA,EAAQ,UAAU,MAAM,EACnD,QAAQ,SAAQ,CAClB,CAEA,OAAQ,CACN,KAAK,QAAQ,QACb,KAAK,OAAO,OACd,CAEA,SAAU,CACR,KAAK,UAAU,QAAQG,GAAY,CACjCA,EAAS,WAAU,CACrB,CAAC,EACD,KAAK,UAAY,GACjB,KAAK,MAAK,EACV,KAAK,QAAU,EACjB,CACF,EAEA,MAAMC,GAAoB,IAAIC,GAC9B,OAAO,kBAAoBD,GAC3B,OAAO,kBAAoBC,GCxMf,MAAC19B,GAAkB,OAAO,gBACzBiC,GAA0B,OAAO,wBACjCiB,GAAe,OAAO,aACtBiC,GAAa,OAAO,WACpBw4B,GAAqB,OAAO,mBAC5B7yB,GAAkB,OAAO,gBACzBM,GAAsB,OAAO,oBAC7B4mB,GAAiB,OAAO,eAExB4L,GAAiB,OAAO,eACxBC,GAAgB,OAAO,cACvB3yB,GAAkB,OAAO,gBACzBC,GAAsB,OAAO,oBAC7BG,GAAc,OAAO,YAErBpG,GAAe,OAAO,aACtB8C,GAAa,OAAO,WACpBqD,GAAkB,OAAO,gBACzBqO,GAAc,OAAO,YACrBC,GAAW,OAAO,SAClBmkB,GAAoB,OAAO,kBAC3BC,GAAwB,OAAO,sBAC/BC,GAAsB,OAAO,oBAC7BC,GAAc,OAAO,YACrBC,GAAW,OAAO,SAElBrjB,GAAY,OAAO,UACnBb,GAAW,OAAO,SAClBD,GAAW,OAAO,SAClBO,GAAW,OAAO,SAClBD,GAAW,OAAO,SAElB8jB,GAAgB,OAAO,cACvBC,GAAc,OAAO,YACrBC,GAAkB,OAAO,gBACzBC,GAAkB,OAAO,gBACzBC,GAAc,OAAO,YACrBve,GAAgB,OAAO,cACvBwe,GAAc,OAAO,YACrBhd,GAAa,OAAO,WACpBid,GAAc,OAAO,YACrBC,GAAoB,OAAO,kBAC3BC,GAAe,OAAO,aACtB9a,GAAkB,OAAO,gBACzBS,GAAgB,OAAO,cACvBsa,GAAmB,OAAO,iBAC1BzZ,GAAgB,OAAO,cACvBO,GAAkB,OAAO,gBACzBmZ,GAAoB,OAAO,kBAC3BlY,GAAW,OAAO,SAClBqB,GAAgB,OAAO,cACvB8C,GAAe,OAAO,aACtBgU,GAAe,OAAO,aACtBC,GAAiB,OAAO,eACxBhP,GAAmB,OAAO,iBAC1BiP,GAAY,OAAO,UACnBhM,GAAiB,OAAO,eACxBO,GAAmB,OAAO,iBAC1B8B,GAAoB,OAAO,kBAE3ByB,GAAQ,OAAO,MACfP,GAAM,OAAO,IACbC,GAAW,OAAO,SAClBC,GAAY,OAAO,UACnBC,GAAc,OAAO,YACrBC,GAAY,OAAO,UACnBC,GAAQ,OAAO,MACfC,GAAW,OAAO,SAElBM,GAAa,OAAO,WACpBa,GAAU,OAAO,QACjBC,GAAa,OAAO,WAEpBoB,GAAkB,OAAO,gBACzB4F,GAAY,OAAO,UAEnBpF,GAAa,OAAO,WACpBD,GAAa,OAAO,WACpBE,GAAa,OAAO,WACpBpX,GAAI,OAAO,EACXxM,GAAI,OAAO,EACX6jB,GAAY,OAAO,UACnBC,GAAY,OAAO,UACnBC,GAAa,OAAO,WACpBC,GAAe,OAAO,aACtBC,GAAiB,OAAO,eAExBgB,GAAqB,OAAO,mBAC5BD,GAAe,OAAO,aACtBE,GAAK,OAAO,GACZC,GAAM,OAAO,IACbC,GAAO,OAAO,KACdC,GAAa,OAAO,WAEpBc,GAAiB,OAAO,eACxBD,GAAiB,OAAO,eAExBQ,GAAqB,OAAO,mBAC5BD,GAAqB,OAAO,mBAE5Be,GAAoB,OAAO,kBAC3BD,GAAoB,OAAO,kBAExC15B,GAAe,CACb,gBAAA/D,GACA,wBAAAiC,GACA,aAAAiB,GACA,WAAAiC,GACA,mBAAAw4B,GACA,gBAAA7yB,GACA,oBAAAM,GACA,eAAA4mB,GACA,eAAAqK,GACA,mBAAAO,GACA,kBAAAc,GACA,eAAAE,GACA,cAAAC,GACA,gBAAA3yB,GACA,oBAAAC,GACA,eAAAixB,GACA,mBAAAO,GACA,kBAAAc,GACA,YAAAnyB,GACA,aAAApG,GACA,WAAA8C,GACA,gBAAAqD,GACA,YAAAqO,GACA,SAAAC,GACA,kBAAAmkB,GACA,sBAAAC,GACA,oBAAAC,GACA,YAAAC,GACA,SAAAC,GACA,UAAArjB,GACA,SAAAb,GACA,SAAAD,GACA,SAAAO,GACA,SAAAD,GACA,cAAA8jB,GACA,YAAAC,GACA,gBAAAC,GACA,gBAAAC,GACA,YAAAC,GACA,cAAAve,GACA,YAAAwe,GACA,WAAAhd,GACA,YAAAid,GACA,kBAAAC,GACA,aAAAC,GACA,gBAAA9a,GACA,cAAAS,GACA,iBAAAsa,GACA,cAAAzZ,GACA,gBAAAO,GACA,kBAAAmZ,GACA,SAAAlY,GACA,cAAAqB,GACA,aAAA8C,GACA,aAAAgU,GACA,eAAAC,GACA,iBAAAhP,GACA,UAAAiP,GACA,eAAAhM,GACA,iBAAAO,GACA,kBAAA8B,GACA,MAAAyB,GACA,IAAAP,GACA,SAAAC,GACA,UAAAC,GACA,YAAAC,GACA,UAAAC,GACA,MAAAC,GACA,SAAAC,GACA,WAAAM,GACA,QAAAa,GACA,WAAAC,GACA,gBAAAoB,GACA,UAAA4F,GACA,WAAApF,GACA,WAAAD,GACA,WAAAE,GACA,EAAApX,GACA,EAAAxM,GACA,UAAA6jB,GACA,UAAAC,GACA,WAAAC,GACA,aAAAC,GACA,eAAAC,GACA,mBAAAgB,GACA,aAAAD,GACA,GAAAE,GACA,IAAAC,GACA,KAAAC,GACA,WAAAC,EACF"}
|