{"version":3,"file":"myassays-layout-viewer.iife.js","sources":["../../../src/myassays-global/PropTypes.js","../../../src/myassays-global/FlashTimer.js","../../../src/myassays-global/abstractClasses/MyassaysComponent.js","../../../src/myassays-global/Utils.js","../styles.css?raw","../MyassaysLayoutViewer.js","../index.js"],"sourcesContent":["\nconst types = {\n NUMBER: 'number',\n STRING: 'string',\n JSON: 'json',\n BOOL: 'bool',\n DIMENSION: 'dimension',\n STYLE: 'style',\n};\n\nfunction attributesToObject(attributes) {\n if (attributes instanceof NamedNodeMap) {\n const result = {};\n for (let i = 0; i < attributes.length; i++) {\n const attr = attributes.item(i);\n result[attr.name.toLowerCase()] = {name: attr.name, value: attr.value};\n }\n return result;\n } else {\n return attributes;\n }\n}\n\nclass PropType {\n constructor(type) {\n this._type = type;\n this._required = false;\n this._observed = false;\n this._comment = '';\n this._defaultValue = undefined;\n this._attrName = '';\n\n if (type === types.STRING) {\n this._lookup = undefined;\n\n this.lookup = valueArrayOrObject => {\n this._lookup = Object.values(valueArrayOrObject);\n this._caseSensitive = false;\n Object.defineProperty(this, 'caseSensitive', {\n get() {\n this._caseSensitive = true;\n return this;\n }\n });\n return this;\n }\n this.regExp = regExp => {\n this._regExp = regExp;\n return this;\n }\n }\n\n if (type === types.NUMBER) {\n this._minValue = undefined;\n this._maxValue = undefined;\n\n this.min = value => {\n this._minValue = value;\n return this;\n }\n\n this.max = value => {\n this._maxValue = value;\n return this;\n }\n }\n }\n\n get required() {\n this._required = true;\n return this;\n }\n\n get observed() {\n this._observed = true;\n return this;\n }\n\n comment(value) {\n this._comment = value;\n return this;\n }\n\n default(value) {\n this._defaultValue = value;\n return this;\n }\n\n attrName(value) {\n this._attrName = value;\n return this;\n }\n\n _setAttrNameFromPropName(value, noHyphens) {\n if (! this._attrName) {\n this._attrName = (noHyphens ? value : value.replace(/([A-Z])/g, '-$1')).toLowerCase();\n }\n }\n}\n\nclass PropTypes {\n static ALLOW_HYPHENS_IN_ATTRIBUTE_NAMES = '_allowHyphensInAttributeNames';\n static get number() { return new PropType(types.NUMBER) };\n static get string() { return new PropType(types.STRING) };\n static get bool() { return new PropType(types.BOOL) };\n static get dimension() { return new PropType(types.DIMENSION) };\n static get style() { return new PropType(types.STYLE) };\n static get json() { return new PropType(types.JSON) };\n\n static getDefaults(propTypes) {\n const defaults = {};\n Object.keys(propTypes).map(key => {\n if (key !== this.ALLOW_HYPHENS_IN_ATTRIBUTE_NAMES) {\n const propType = propTypes[key];\n if (propType._defaultValue !== undefined) {\n defaults[key] = propType._defaultValue;\n }\n }\n });\n return defaults;\n }\n\n static getObserved(propTypes) {\n const observed = [];\n const noHyphens = propTypes._allowHyphensInAttributeNames === false;\n Object.keys(propTypes).map(key => {\n if (key !== this.ALLOW_HYPHENS_IN_ATTRIBUTE_NAMES) {\n const propType = propTypes[key];\n propType._setAttrNameFromPropName(key, noHyphens);\n if (propType._observed) {\n observed.push(propType._attrName);\n }\n }\n });\n return observed;\n }\n\n static propTypesToDoc(propTypes) {\n let docLines = [];\n\n let commentsExist = false;\n const noHyphens = propTypes._allowHyphensInAttributeNames === false;\n\n Object.keys(propTypes).forEach(key => {\n if (key !== this.ALLOW_HYPHENS_IN_ATTRIBUTE_NAMES) {\n const propType = propTypes[key];\n propType._setAttrNameFromPropName(key, noHyphens);\n if (propType._comment !== '') {\n commentsExist = true;\n }\n docLines.push(`| ${[\n `${propType._attrName}`,\n propType._type,\n (propType => {\n const parts = [];\n if (propType._type === types.NUMBER) {\n if (propType._minValue !== undefined) {\n parts.push(`min: ${propType._minValue}`);\n }\n if (propType._maxValue !== undefined) {\n parts.push(`max: ${propType._maxValue}`);\n }\n } else if (propType._type === types.STRING) {\n if (propType._lookup) {\n parts.push(`one of: ${propType._lookup.map(item => `\"${item}\"`).join(', ')}${propType._caseSensitive ? ' (case sensitive)' : ''}`);\n }\n if (propType._regExp) {\n parts.push(`conforms to regExp: \\`${propType._regExp.toString()}\\``);\n }\n } else if (propType._type === types.JSON) {\n parts.push('a valid JSON string');\n } else if (propType._type === types.STYLE) {\n parts.push('valid inline css styles');\n } else if (propType._type === types.DIMENSION) {\n parts.push('a number with optional \"px\" or \"%\" suffix, or \"content\"')\n }\n return parts.join(', ');\n })(propType),\n (propType => {\n if (propType._defaultValue === undefined) return '';\n if (propType._type === types.JSON) return `'${JSON.stringify(propType._defaultValue)}'`;\n if (propType._type === types.NUMBER || propType._type === types.BOOL) return propType._defaultValue;\n return `\"${propType._defaultValue}\"`;\n })(propType),\n propType._required ? 'yes' : '',\n propType._observed ? 'yes' : '',\n propType._comment.replace(/\\n/g, '
'),\n ].join(' | ')} |`);\n }\n });\n if (!commentsExist) {\n docLines = docLines.map(item => item.replace(/\\| +\\|$/, '|'))\n }\n docLines.unshift('| --- | --- | --- | --- | --- | --- |' + (commentsExist ? ' --- |' : ''));\n docLines.unshift('| Attribute | Type | Valid Values | Default | Reqrd | Obsvd |' + (commentsExist ? ' Comment |' : ''));\n return docLines.join('\\n').replace(/_/g, '\\\\_');\n }\n\n static attributesToProps(element, singleAttrName) {\n const attributes = element.attributes;\n const propTypes = element.constructor.propTypes;\n const hash = {};\n const required = [];\n const noHyphens = propTypes._allowHyphensInAttributeNames === false;\n Object.keys(propTypes).forEach(key => {\n if (key !== this.ALLOW_HYPHENS_IN_ATTRIBUTE_NAMES) {\n const propType = propTypes[key];\n propType._setAttrNameFromPropName(key, noHyphens);\n hash[propType._attrName] = {\n name: key,\n propType: propType,\n }\n if (propType._required) {\n required.push(key);\n }\n }\n });\n const props = {};\n const attrObject = attributesToObject(attributes);\n const elementId = `Location: ${element.id ? `id=${element.id}` : element.outerHTML}`;\n Object.keys(attrObject).filter(key => !singleAttrName || key === singleAttrName).map(key => {\n const { name, value } = attrObject[key];\n let convertedValue;\n const info = hash[key];\n if (info === undefined) {\n throw new Error(`Unknown attribute \"${name}\". ${elementId}`);\n } else {\n const propType = hash[key].propType;\n switch (propType._type) {\n case types.BOOL:\n if (typeof value === 'boolean') {\n convertedValue = value;\n } else {\n const lowerCaseValue = value.toLowerCase();\n if (lowerCaseValue !== 'true' && lowerCaseValue !== 'false') {\n throw new Error(`Attribute \"${name}\" must be either \"true\" or \"false\". ${elementId}`);\n } else {\n convertedValue = lowerCaseValue === 'true';\n }\n }\n break;\n case types.DIMENSION:\n if (! /^(-?\\d+(\\.\\d+)?(px|%)?|content)$/.test(value)) {\n throw new Error(`Attribute \"${name}\" must be a number with optional \"px\" or \"%\" suffix, or \"content\". ${elementId}`);\n } else {\n convertedValue = value.replace(/([-\\d.]+)(px|)$/, '$1px');\n }\n break;\n case types.STRING:\n convertedValue = value;\n if (propType._required && !convertedValue) {\n throw new Error(`Attribute \"${name}\" must be one of ${propType._lookup.join('|')}. ${elementId}`);\n }\n if (propType._lookup !== undefined) {\n let testValue, testLookup;\n if (propType._caseSensitive) {\n testValue = convertedValue;\n testLookup = propType._lookup;\n } else {\n testValue = convertedValue.toLowerCase();\n testLookup = propType._lookup.map(item => item.toLowerCase());\n }\n if (! testLookup.includes(testValue)) {\n throw new Error(`Attribute \"${name}\" must be one of ${propType._lookup.join('|')}. ${elementId}`);\n }\n convertedValue = testValue;\n }\n if (propType._regExp !== undefined) {\n if (! propType._regExp.test(convertedValue)) {\n throw new Error(`Attribute \"${name}\" must conform to reg. exp. \"${propType._regExp.toString()}\". ${elementId}`);\n }\n }\n break;\n case types.NUMBER:\n convertedValue = parseFloat(value);\n if (isNaN(convertedValue)) {\n throw new Error(`Attribute \"${name}\" must be a valid number. ${elementId}`);\n }\n if (propType._minValue !== undefined && convertedValue < propType._minValue) {\n throw new Error(`Attribute \"${name}\" must not be less than ${propType._minValue}. ${elementId}`);\n }\n if (propType._maxValue !== undefined && convertedValue > propType._maxValue) {\n throw new Error(`Attribute \"${name}\" must not be greater than ${propType._maxValue}. ${elementId}`);\n }\n break;\n case types.STYLE:\n convertedValue = value.replace(/^\\s*(.*?);?\\s*$/, '$1;');\n if (!/^([a-zA-Z\\-\\s]+:[a-zA-Z0-9\\-.\\s#%\\(\\)\\+,']*;)+$/.test(convertedValue)) {\n throw new Error(`Attribute \"${name}\" must be a valid inline style declaration. ${elementId}`);\n }\n break;\n case types.JSON:\n try {\n convertedValue = JSON.parse(value);\n } catch (error) {\n throw new Error(`Attribute \"${name}\" must be a valid JSON string. ${elementId}`);\n }\n break;\n }\n props[hash[key].name] = convertedValue;\n }\n });\n\n if (!singleAttrName) {\n required.forEach(name => {\n if (props[name] === undefined) {\n throw new Error(`Attribute \"${name.replace(/([A-Z])/g, '-$1').toLowerCase()}\" is required. ${elementId}`);\n }\n });\n }\n\n return {\n ...(singleAttrName ? {} : PropTypes.getDefaults(propTypes)),\n ...props,\n };\n }\n}\n\nexport default PropTypes;\n","\nexport default class FlashTimer {\n static _startTimer() {\n if (this._timerId === undefined) {\n this._state = false;\n this._timerId = setInterval(() => this._toggleState(), 500);\n }\n }\n\n static _stopTimer() {\n clearInterval(this._timerId);\n delete this._timerId;\n }\n\n static _toggleState() {\n this._state = !this._state;\n this._subscribers.forEach(handler => handler(this._state));\n }\n\n static subscribe(handler) {\n this._subscribers || (this._subscribers = []);\n if (! this._subscribers.includes(handler)) {\n this._subscribers.push(handler);\n }\n this._startTimer();\n }\n\n static unSubscribe(handler) {\n this._subscribers = this._subscribers.filter(item => item !== handler);\n if (this._subscribers.length === 0) {\n delete this._subscribers;\n this._stopTimer();\n }\n }\n\n static get state() {\n return this._state;\n }\n}\n","import { PropTypes } from 'myassays-global';\n\nexport default class MyassaysComponent extends HTMLElement {\n static get documentationMarkdown() {\n const { propTypes } = this;\n if (propTypes) {\n return `\\\n${PropTypes.propTypesToDoc(propTypes)}`;\n } else {\n return 'No documentation available';\n }\n }\n}\n","\nexport default class Utils {\n static repeat (times, iterator) {\n return Array(times).fill('').map((val, index) => iterator(index)).join('');\n }\n\n static setCssVariable(css, name, value) {\n const cssString = String(css);\n if (cssString.indexOf(`${name}:`) > -1) {\n return cssString.replace(new RegExp(`${name}:.*?(;|})`), `${name}: ${value}$1`);\n } else {\n return `* {${name}: ${value};} ${cssString}`;\n }\n }\n\n static classes(...list) {\n let classNames = [];\n let className;\n while (className = list.shift()) {\n if (!!list.shift()) classNames.push(className);\n }\n return classNames.join(' ');\n }\n\n static range(start, stop, step) {\n if (stop === null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n const length = Math.max(Math.ceil((stop - start) / step), 0);\n const range = Array(length);\n\n for (let idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n }\n\n static isBetween (num1, num2, num3) {\n if (num2 > num3) {\n return num1 <= num2 && num1 >= num3;\n } else {\n return num1 >= num2 && num1 <= num3;\n }\n }\n\n static makeDataUrl(data) {\n return `data:image/svg+xml,${encodeURIComponent(data)}`;\n }\n\n static xmlToObject(xmlString, options = {}) {\n const { arrays = [], exclude = [], booleans = [], numbers = [], preserveCapitals = false } = options;\n\n function formatName(name) {\n return preserveCapitals ? name : name.charAt(0).toLowerCase() + name.slice(1);\n }\n\n function convertType(name, value) {\n if (booleans.includes(name)) {\n return value.toLowerCase() === 'true';\n }\n if (numbers.includes(name)) {\n return Number(value);\n }\n return value;\n }\n\n const parser = new DOMParser();\n let dom;\n try {\n dom = parser.parseFromString(xmlString, 'application/xml');\n } catch (error) {\n console.log('ERROR: XmlToObject failed to parse XML');\n return null;\n }\n\n function parseNode(xmlNode, result) {\n let nodeName = xmlNode.nodeName;\n if (nodeName === \"#text\") {\n let v = xmlNode.nodeValue;\n if (v.trim()) result['#text'] = v;\n return;\n }\n\n if (exclude.indexOf(nodeName) !== -1) {\n return;\n }\n\n name = formatName(nodeName);\n\n let jsonNode = {},\n existing = result[name];\n if (existing) {\n if (!Array.isArray(existing)) result[name] = [existing, jsonNode];\n else result[name].push(jsonNode);\n }\n else {\n if (arrays.indexOf(nodeName) !== -1) result[name] = [jsonNode];\n else result[name] = jsonNode;\n }\n\n if (xmlNode.attributes) for (let attribute of xmlNode.attributes) jsonNode[formatName(attribute.nodeName)] = convertType(attribute.nodeName, attribute.nodeValue);\n\n for (let node of xmlNode.childNodes) parseNode(node, jsonNode);\n }\n\n let result = {};\n for (let node of dom.childNodes) parseNode(node, result);\n\n return result;\n }\n}\n","export default \"\\n:host {\\n display: block;\\n}\\n\\n.layout {\\n}\\n\\ntable {\\n --cell_size: 0;\\n font-size: calc(var(--cell_size) / 1.8);\\n padding: 0;\\n table-layout: fixed;\\n border-spacing: 0;\\n border-collapse: collapse;\\n user-select: none;\\n width: 100%;\\n}\\n\\ntd {\\n text-align: center;\\n padding: 0;\\n width: var(--cell_size);\\n height: var(--cell_size);\\n max-width: var(--cell_size);\\n max-height: var(--cell_size);\\n min-width: var(--cell_size);\\n min-height: var(--cell_size);\\n box-sizing: border-box;\\n}\\n\\ntd.cell {\\n color: black;\\n}\\n\\n.flashing {\\n transition: background-color 1000ms;\\n}\\n\\ntable:not(.flash-on) .flashing {\\n transition: background-color 300ms;\\n}\\n\\n\\n.heading {\\n font-size: calc(var(--cell_size) / 2.5);\\n}\\n\\ntr:first-child .heading:first-child {\\n border: none;\\n}\\n\\ntr:nth-child(2) .heading:first-child {\\n border-top: none;\\n}\\n\\ntr:first-child .heading:nth-child(2) {\\n border-left: none;\\n}\\n\\n\\n\"","import {Utils, PropTypes, FlashTimer, MyassaysComponent} from 'myassays-global';\nimport styles from './styles.css?raw';\n\nconst { repeat } = Utils;\n\nexport default class MyassaysLayoutViewer extends MyassaysComponent {\n static get propTypes() {\n return {\n id: PropTypes.string,\n class: PropTypes.string,\n style: PropTypes.string,\n onclick: PropTypes.string,\n dataConfig: PropTypes.json.default({}).observed,\n flashEnabled: PropTypes.bool.default(true).observed,\n flashWellPositions: PropTypes.string.regExp(/^\\d*( *, *\\d*)*$/).default('').observed,\n flashColour: PropTypes.string.default('black'),\n flashBackgroundColour: PropTypes.string.default('white'),\n }\n }\n constructor(options) {\n super();\n\n if (options) {\n this.options = options;\n this.id = options.id;\n }\n\n this.shadow = this.attachShadow({mode: \"open\"});\n this._hasBeenRendered = false;\n\n if (options) {\n const parentElem = options.parent;\n if (parentElem) {\n parentElem.appendChild(this);\n }\n }\n }\n\n static get observedAttributes() {\n return PropTypes.getObserved(this.propTypes);\n }\n\n static template = data => `\n \n\n
\n \n \n \n \n ${repeat(data.width, col => ``)}\n \n ${repeat(data.height, row => `${repeat(data.width, col => {\n const wellIndex = row*data.totalColumns + col;\n const flashingClass = data.flashEnabled && data.flashWellPositions.includes(wellIndex + 1) ? `flashing` : '';\n \n const sampleType = data.default.shift();\n let number = data.default.shift();\n if (sampleType === '1' || number === '0') {\n number = ' ';\n }\n return ``;\n })}`)}\n \n
 ${col + 1}
${data.toRowCode(row + 1)}${number}
\n
\n`\n onFlashStateChange = state => {\n const table = this.shadow.querySelector('table');\n if (table) {\n table.classList.toggle('flash-on', state);\n }\n }\n\n render(data) {\n return this.constructor.template(data);\n }\n\n configure() {\n let config;\n if (!this.options) {\n config = this._props.dataConfig;\n } else {\n config = this.options.config;\n }\n const width = this._width = parseInt(config.Width);\n const height = this._height = parseInt(config.Height);\n\n const data = {\n width,\n height,\n default: config.Default.split(','),\n sampleTypes: config.SampleTypes,\n flashEnabled: this._props.flashEnabled,\n flashWellPositions: this._props.flashWellPositions ? this._props.flashWellPositions.split(/ *, */).map(item => Number(item)) : [],\n flashColour: this._props.flashColour,\n flashBackgroundColour: this._props.flashBackgroundColour,\n totalColumns: config.Width,\n toRowCode: row => row > 26 ? String.fromCharCode(64 + Math.floor(row / 26)) + String.fromCharCode(64 + row % 26) : String.fromCharCode(64 + row)\n }\n this.shadow.innerHTML = this.render(data);\n this.resize();\n }\n\n resize = () => {\n const tableElement = this.shadow.querySelector('table');\n if (!this._isSized) {\n const pixelWidth = tableElement.getBoundingClientRect().width;\n const borderSpacing = parseInt(getComputedStyle(tableElement).borderSpacing.split(/ +/)[0]);\n this._cellSize = (pixelWidth - borderSpacing * this._width) / (this._width + 1);\n }\n\n if (this._cellSize > 0) {\n tableElement.style.setProperty('--cell_size', `${this._cellSize}px`);\n this._isSized = true;\n }\n }\n\n connectedCallback() {\n this._props = PropTypes.attributesToProps(this);\n this.configure();\n this.resizeObserver = new ResizeObserver(this.resize);\n this.resizeObserver.observe(this);\n this._hasBeenRendered = true;\n FlashTimer.subscribe(this.onFlashStateChange);\n }\n\n disconnectedCallback() {\n FlashTimer.unSubscribe(this.onFlashStateChange);\n this.resizeObserver.disconnect();\n }\n\n attributeChangedCallback(attrName, oldVal, newVal) {\n if (this._hasBeenRendered) {\n this._props = {...this._props, ...PropTypes.attributesToProps(this, attrName)};\n this.configure();\n }\n }\n}\n","import MyassaysLayoutViewer from './MyassaysLayoutViewer';\n\ncustomElements.define('myassays-layout-viewer', MyassaysLayoutViewer);\n\nexport default MyassaysLayoutViewer;\n"],"names":["types","attributesToObject","attributes","result","i","attr","PropType","type","valueArrayOrObject","regExp","value","noHyphens","_PropTypes","propTypes","defaults","key","propType","observed","docLines","commentsExist","parts","item","element","singleAttrName","hash","required","props","attrObject","elementId","name","convertedValue","lowerCaseValue","testValue","testLookup","__publicField","PropTypes","FlashTimer","handler","MyassaysComponent","Utils","times","iterator","val","index","css","cssString","list","classNames","className","start","stop","step","length","range","idx","num1","num2","num3","data","xmlString","options","arrays","exclude","booleans","numbers","preserveCapitals","formatName","convertType","parser","dom","parseNode","xmlNode","nodeName","v","jsonNode","existing","attribute","node","styles","repeat","MyassaysLayoutViewer","state","table","tableElement","pixelWidth","borderSpacing","parentElem","config","width","height","row","attrName","oldVal","newVal","col","wellIndex","flashingClass","sampleType","number"],"mappings":"yNACA,MAAMA,EAAQ,CACV,OAAQ,SACR,OAAQ,SACR,KAAM,OACN,KAAM,OACN,UAAW,YACX,MAAO,OACX,EAEA,SAASC,EAAmBC,EAAY,CACpC,GAAIA,aAAsB,aAAc,CACpC,MAAMC,EAAS,CAAA,EACf,QAASC,EAAI,EAAGA,EAAIF,EAAW,OAAQE,IAAK,CACxC,MAAMC,EAAOH,EAAW,KAAKE,CAAC,EAC9BD,EAAOE,EAAK,KAAK,YAAa,CAAA,EAAI,CAAC,KAAMA,EAAK,KAAM,MAAOA,EAAK,KAAK,CACxE,CACD,OAAOF,CACf,KACQ,QAAOD,CAEf,CAEA,MAAMI,CAAS,CACX,YAAYC,EAAM,CACd,KAAK,MAAQA,EACb,KAAK,UAAY,GACjB,KAAK,UAAY,GACjB,KAAK,SAAW,GAChB,KAAK,cAAgB,OACrB,KAAK,UAAY,GAEbA,IAASP,EAAM,SACf,KAAK,QAAU,OAEf,KAAK,OAASQ,IACV,KAAK,QAAU,OAAO,OAAOA,CAAkB,EAC/C,KAAK,eAAiB,GACtB,OAAO,eAAe,KAAM,gBAAiB,CACzC,KAAM,CACF,YAAK,eAAiB,GACf,IACV,CACrB,CAAiB,EACM,MAEX,KAAK,OAASC,IACV,KAAK,QAAUA,EACR,OAIXF,IAASP,EAAM,SACf,KAAK,UAAY,OACjB,KAAK,UAAY,OAEjB,KAAK,IAAMU,IACP,KAAK,UAAYA,EACV,MAGX,KAAK,IAAMA,IACP,KAAK,UAAYA,EACV,MAGlB,CAED,IAAI,UAAW,CACX,YAAK,UAAY,GACV,IACV,CAED,IAAI,UAAW,CACX,YAAK,UAAY,GACV,IACV,CAED,QAAQA,EAAO,CACX,YAAK,SAAWA,EACT,IACV,CAED,QAAQA,EAAO,CACX,YAAK,cAAgBA,EACd,IACV,CAED,SAASA,EAAO,CACZ,YAAK,UAAYA,EACV,IACV,CAED,yBAAyBA,EAAOC,EAAW,CACjC,KAAK,YACP,KAAK,WAAaA,EAAYD,EAAQA,EAAM,QAAQ,WAAY,KAAK,GAAG,cAE/E,CACL,CAEA,MAAME,EAAN,MAAMA,CAAU,CAEZ,WAAW,QAAS,CAAE,OAAO,IAAIN,EAASN,EAAM,MAAM,CAAG,CACzD,WAAW,QAAS,CAAE,OAAO,IAAIM,EAASN,EAAM,MAAM,CAAG,CACzD,WAAW,MAAO,CAAE,OAAO,IAAIM,EAASN,EAAM,IAAI,CAAG,CACrD,WAAW,WAAY,CAAE,OAAO,IAAIM,EAASN,EAAM,SAAS,CAAG,CAC/D,WAAW,OAAQ,CAAE,OAAO,IAAIM,EAASN,EAAM,KAAK,CAAG,CACvD,WAAW,MAAO,CAAE,OAAO,IAAIM,EAASN,EAAM,IAAI,CAAG,CAErD,OAAO,YAAYa,EAAW,CAC1B,MAAMC,EAAW,CAAA,EACjB,cAAO,KAAKD,CAAS,EAAE,IAAIE,GAAO,CAC9B,GAAIA,IAAQ,KAAK,iCAAkC,CAC/C,MAAMC,EAAWH,EAAUE,CAAG,EAC1BC,EAAS,gBAAkB,SAC3BF,EAASC,CAAG,EAAIC,EAAS,cAEhC,CACb,CAAS,EACMF,CACV,CAED,OAAO,YAAYD,EAAW,CAC1B,MAAMI,EAAW,CAAA,EACXN,EAAYE,EAAU,gCAAkC,GAC9D,cAAO,KAAKA,CAAS,EAAE,IAAIE,GAAO,CAC9B,GAAIA,IAAQ,KAAK,iCAAkC,CAC/C,MAAMC,EAAWH,EAAUE,CAAG,EAC9BC,EAAS,yBAAyBD,EAAKJ,CAAS,EAC5CK,EAAS,WACTC,EAAS,KAAKD,EAAS,SAAS,CAEvC,CACb,CAAS,EACMC,CACV,CAED,OAAO,eAAeJ,EAAW,CAC7B,IAAIK,EAAW,CAAA,EAEXC,EAAgB,GACpB,MAAMR,EAAYE,EAAU,gCAAkC,GAE9D,cAAO,KAAKA,CAAS,EAAE,QAAQE,GAAO,CAClC,GAAIA,IAAQ,KAAK,iCAAkC,CAC/C,MAAMC,EAAWH,EAAUE,CAAG,EAC9BC,EAAS,yBAAyBD,EAAKJ,CAAS,EAC5CK,EAAS,WAAa,KACtBG,EAAgB,IAEpBD,EAAS,KAAK,KAAK,CACf,SAASF,EAAS,SAAS,UAC3BA,EAAS,OACRA,GAAY,CACT,MAAMI,EAAQ,CAAA,EACd,OAAIJ,EAAS,QAAUhB,EAAM,QACrBgB,EAAS,YAAc,QACvBI,EAAM,KAAK,QAAQJ,EAAS,SAAS,EAAE,EAEvCA,EAAS,YAAc,QACvBI,EAAM,KAAK,QAAQJ,EAAS,SAAS,EAAE,GAEpCA,EAAS,QAAUhB,EAAM,QAC5BgB,EAAS,SACTI,EAAM,KAAK,WAAWJ,EAAS,QAAQ,IAAIK,GAAQ,IAAIA,CAAI,GAAG,EAAE,KAAK,IAAI,CAAC,GAAGL,EAAS,eAAiB,oBAAsB,EAAE,EAAE,EAEjIA,EAAS,SACTI,EAAM,KAAK,+BAA+BJ,EAAS,QAAQ,SAAQ,CAAE,WAAW,GAE7EA,EAAS,QAAUhB,EAAM,KAChCoB,EAAM,KAAK,qBAAqB,EACzBJ,EAAS,QAAUhB,EAAM,MAChCoB,EAAM,KAAK,yBAAyB,EAC7BJ,EAAS,QAAUhB,EAAM,WAChCoB,EAAM,KAAK,yDAAyD,EAEjEA,EAAM,KAAK,IAAI,CACzB,GAAEJ,CAAQ,GACVA,GACOA,EAAS,gBAAkB,OAAkB,GAC7CA,EAAS,QAAUhB,EAAM,KAAa,IAAI,KAAK,UAAUgB,EAAS,aAAa,CAAC,IAChFA,EAAS,QAAUhB,EAAM,QAAUgB,EAAS,QAAUhB,EAAM,KAAagB,EAAS,cAC/E,IAAIA,EAAS,aAAa,KAClCA,CAAQ,EACXA,EAAS,UAAY,MAAQ,GAC7BA,EAAS,UAAY,MAAQ,GAC7BA,EAAS,SAAS,QAAQ,MAAO,OAAO,CAC3C,EAAC,KAAK,KAAK,CAAC,IAAI,CACpB,CACb,CAAS,EACIG,IACDD,EAAWA,EAAS,IAAIG,GAAQA,EAAK,QAAQ,UAAW,GAAG,CAAC,GAEhEH,EAAS,QAAQ,yCAA2CC,EAAgB,SAAW,GAAG,EAC1FD,EAAS,QAAQ,iEAAmEC,EAAgB,aAAe,GAAG,EAC/GD,EAAS,KAAK;AAAA,CAAI,EAAE,QAAQ,KAAM,KAAK,CACjD,CAED,OAAO,kBAAkBI,EAASC,EAAgB,CAC9C,MAAMrB,EAAaoB,EAAQ,WACrBT,EAAYS,EAAQ,YAAY,UAChCE,EAAO,CAAA,EACPC,EAAW,CAAA,EACXd,EAAYE,EAAU,gCAAkC,GAC9D,OAAO,KAAKA,CAAS,EAAE,QAAQE,GAAO,CAClC,GAAIA,IAAQ,KAAK,iCAAkC,CAC/C,MAAMC,EAAWH,EAAUE,CAAG,EAC9BC,EAAS,yBAAyBD,EAAKJ,CAAS,EAChDa,EAAKR,EAAS,SAAS,EAAI,CACvB,KAAMD,EACN,SAAUC,CACb,EACGA,EAAS,WACTS,EAAS,KAAKV,CAAG,CAExB,CACb,CAAS,EACD,MAAMW,EAAQ,CAAA,EACRC,EAAa1B,EAAmBC,CAAU,EAC1C0B,EAAY,aAAaN,EAAQ,GAAK,MAAMA,EAAQ,EAAE,GAAKA,EAAQ,SAAS,GAClF,cAAO,KAAKK,CAAU,EAAE,OAAOZ,GAAO,CAACQ,GAAkBR,IAAQQ,CAAc,EAAE,IAAIR,GAAO,CACxF,KAAM,CAAE,KAAAc,EAAM,MAAAnB,CAAO,EAAGiB,EAAWZ,CAAG,EACtC,IAAIe,EAEJ,GADaN,EAAKT,CAAG,IACR,OACT,MAAM,IAAI,MAAM,sBAAsBc,CAAI,MAAMD,CAAS,EAAE,EACxD,CACH,MAAMZ,EAAWQ,EAAKT,CAAG,EAAE,SAC3B,OAAQC,EAAS,MAAK,CAClB,KAAKhB,EAAM,KACP,GAAI,OAAOU,GAAU,UACjBoB,EAAiBpB,MACd,CACH,MAAMqB,EAAiBrB,EAAM,cAC7B,GAAIqB,IAAmB,QAAUA,IAAmB,QAChD,MAAM,IAAI,MAAM,cAAcF,CAAI,uCAAuCD,CAAS,EAAE,EAEpFE,EAAiBC,IAAmB,MAE3C,CACD,MACJ,KAAK/B,EAAM,UACP,GAAM,mCAAmC,KAAKU,CAAK,EAG/CoB,EAAiBpB,EAAM,QAAQ,kBAAmB,MAAM,MAFxD,OAAM,IAAI,MAAM,cAAcmB,CAAI,sEAAsED,CAAS,EAAE,EAIvH,MACJ,KAAK5B,EAAM,OAEP,GADA8B,EAAiBpB,EACbM,EAAS,WAAa,CAACc,EACvB,MAAM,IAAI,MAAM,cAAcD,CAAI,oBAAoBb,EAAS,QAAQ,KAAK,GAAG,CAAC,KAAKY,CAAS,EAAE,EAEpG,GAAIZ,EAAS,UAAY,OAAW,CAChC,IAAIgB,EAAWC,EAQf,GAPIjB,EAAS,gBACTgB,EAAYF,EACZG,EAAajB,EAAS,UAEtBgB,EAAYF,EAAe,cAC3BG,EAAajB,EAAS,QAAQ,IAAIK,GAAQA,EAAK,YAAW,CAAE,GAE5D,CAAEY,EAAW,SAASD,CAAS,EAC/B,MAAM,IAAI,MAAM,cAAcH,CAAI,oBAAoBb,EAAS,QAAQ,KAAK,GAAG,CAAC,KAAKY,CAAS,EAAE,EAEpGE,EAAiBE,CACpB,CACD,GAAIhB,EAAS,UAAY,QACjB,CAAEA,EAAS,QAAQ,KAAKc,CAAc,EACtC,MAAM,IAAI,MAAM,cAAcD,CAAI,gCAAgCb,EAAS,QAAQ,SAAQ,CAAE,MAAMY,CAAS,EAAE,EAGtH,MACJ,KAAK5B,EAAM,OAEP,GADA8B,EAAiB,WAAWpB,CAAK,EAC7B,MAAMoB,CAAc,EACpB,MAAM,IAAI,MAAM,cAAcD,CAAI,6BAA6BD,CAAS,EAAE,EAE9E,GAAIZ,EAAS,YAAc,QAAac,EAAiBd,EAAS,UAC9D,MAAM,IAAI,MAAM,cAAca,CAAI,2BAA2Bb,EAAS,SAAS,KAAKY,CAAS,EAAE,EAEnG,GAAIZ,EAAS,YAAc,QAAac,EAAiBd,EAAS,UAC9D,MAAM,IAAI,MAAM,cAAca,CAAI,8BAA8Bb,EAAS,SAAS,KAAKY,CAAS,EAAE,EAEtG,MACJ,KAAK5B,EAAM,MAEP,GADA8B,EAAiBpB,EAAM,QAAQ,kBAAmB,KAAK,EACnD,CAAC,kDAAkD,KAAKoB,CAAc,EACtE,MAAM,IAAI,MAAM,cAAcD,CAAI,+CAA+CD,CAAS,EAAE,EAEhG,MACJ,KAAK5B,EAAM,KACP,GAAI,CACA8B,EAAiB,KAAK,MAAMpB,CAAK,CACpC,MAAe,CACZ,MAAM,IAAI,MAAM,cAAcmB,CAAI,kCAAkCD,CAAS,EAAE,CAClF,CACD,KACP,CACDF,EAAMF,EAAKT,CAAG,EAAE,IAAI,EAAIe,CAC3B,CACb,CAAS,EAEIP,GACDE,EAAS,QAAQI,GAAQ,CACrB,GAAIH,EAAMG,CAAI,IAAM,OAChB,MAAM,IAAI,MAAM,cAAcA,EAAK,QAAQ,WAAY,KAAK,EAAE,YAAa,CAAA,kBAAkBD,CAAS,EAAE,CAE5H,CAAa,EAGE,CACH,GAAIL,EAAiB,CAAE,EAAGX,EAAU,YAAYC,CAAS,EACzD,GAAGa,CACf,CACK,CACL,EAvNIQ,EADEtB,EACK,mCAAmC,iCAD9C,IAAMuB,EAANvB,ECnGe,MAAMwB,CAAW,CAC5B,OAAO,aAAc,CACb,KAAK,WAAa,SAClB,KAAK,OAAS,GACd,KAAK,SAAW,YAAY,IAAM,KAAK,aAAY,EAAI,GAAG,EAEjE,CAED,OAAO,YAAa,CAChB,cAAc,KAAK,QAAQ,EAC3B,OAAO,KAAK,QACf,CAED,OAAO,cAAe,CAClB,KAAK,OAAS,CAAC,KAAK,OACpB,KAAK,aAAa,QAAQC,GAAWA,EAAQ,KAAK,MAAM,CAAC,CAC5D,CAED,OAAO,UAAUA,EAAS,CACtB,KAAK,eAAiB,KAAK,aAAe,CAAE,GACtC,KAAK,aAAa,SAASA,CAAO,GACpC,KAAK,aAAa,KAAKA,CAAO,EAElC,KAAK,YAAW,CACnB,CAED,OAAO,YAAYA,EAAS,CACxB,KAAK,aAAe,KAAK,aAAa,OAAOhB,GAAQA,IAASgB,CAAO,EACjE,KAAK,aAAa,SAAW,IAC7B,OAAO,KAAK,aACZ,KAAK,WAAU,EAEtB,CAED,WAAW,OAAQ,CACf,OAAO,KAAK,MACf,CACL,CCpCe,MAAMC,UAA0B,WAAY,CACvD,WAAW,uBAAwB,CAC/B,KAAM,CAAE,UAAAzB,CAAW,EAAG,KACtB,OAAIA,EACO,GACjBsB,EAAU,eAAetB,CAAS,CAAC,GAElB,4BAEd,CACL,CCXe,MAAM0B,CAAM,CACvB,OAAO,OAAQC,EAAOC,EAAU,CAC5B,OAAO,MAAMD,CAAK,EAAE,KAAK,EAAE,EAAE,IAAI,CAACE,EAAKC,IAAUF,EAASE,CAAK,CAAC,EAAE,KAAK,EAAE,CAC5E,CAED,OAAO,eAAeC,EAAKf,EAAMnB,EAAO,CACpC,MAAMmC,EAAY,OAAOD,CAAG,EAC5B,OAAIC,EAAU,QAAQ,GAAGhB,CAAI,GAAG,EAAI,GACzBgB,EAAU,QAAQ,IAAI,OAAO,GAAGhB,CAAI,WAAW,EAAG,GAAGA,CAAI,KAAKnB,CAAK,IAAI,EAEvE,MAAMmB,CAAI,KAAKnB,CAAK,MAAMmC,CAAS,EAEjD,CAED,OAAO,WAAWC,EAAM,CACpB,IAAIC,EAAa,CAAA,EACbC,EACJ,KAAOA,EAAYF,EAAK,SACdA,EAAK,MAAK,GAAIC,EAAW,KAAKC,CAAS,EAEjD,OAAOD,EAAW,KAAK,GAAG,CAC7B,CAED,OAAO,MAAME,EAAOC,EAAMC,EAAM,CACxBD,IAAS,OACTA,EAAOD,GAAS,EAChBA,EAAQ,GAEPE,IACDA,EAAOD,EAAOD,EAAQ,GAAK,GAG/B,MAAMG,EAAS,KAAK,IAAI,KAAK,MAAMF,EAAOD,GAASE,CAAI,EAAG,CAAC,EACrDE,EAAQ,MAAMD,CAAM,EAE1B,QAASE,EAAM,EAAGA,EAAMF,EAAQE,IAAOL,GAASE,EAC5CE,EAAMC,CAAG,EAAIL,EAGjB,OAAOI,CACV,CAED,OAAO,UAAWE,EAAMC,EAAMC,EAAM,CAChC,OAAID,EAAOC,EACAF,GAAQC,GAAQD,GAAQE,EAExBF,GAAQC,GAAQD,GAAQE,CAEtC,CAED,OAAO,YAAYC,EAAM,CACrB,MAAO,sBAAsB,mBAAmBA,CAAI,CAAC,EACxD,CAED,OAAO,YAAYC,EAAWC,EAAU,GAAI,CACxC,KAAM,CAAE,OAAAC,EAAS,CAAA,EAAI,QAAAC,EAAU,CAAE,EAAE,SAAAC,EAAW,GAAI,QAAAC,EAAU,CAAA,EAAI,iBAAAC,EAAmB,EAAK,EAAKL,EAE7F,SAASM,EAAWrC,EAAM,CACtB,OAAOoC,EAAmBpC,EAAOA,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,MAAM,CAAC,CAC/E,CAED,SAASsC,EAAYtC,EAAMnB,EAAO,CAC9B,OAAIqD,EAAS,SAASlC,CAAI,EACfnB,EAAM,YAAa,IAAK,OAE/BsD,EAAQ,SAASnC,CAAI,EACd,OAAOnB,CAAK,EAEhBA,CACV,CAED,MAAM0D,EAAS,IAAI,UACnB,IAAIC,EACJ,GAAI,CACAA,EAAMD,EAAO,gBAAgBT,EAAW,iBAAiB,CAC5D,MAAe,CACZ,eAAQ,IAAI,wCAAwC,EAC7C,IACV,CAED,SAASW,EAAUC,EAASpE,EAAQ,CAChC,IAAIqE,EAAWD,EAAQ,SACvB,GAAIC,IAAa,QAAS,CACtB,IAAIC,EAAIF,EAAQ,UACZE,EAAE,KAAM,IAAEtE,EAAO,OAAO,EAAIsE,GAChC,MACH,CAED,GAAIX,EAAQ,QAAQU,CAAQ,IAAM,GAC9B,OAGJ,KAAON,EAAWM,CAAQ,EAE1B,IAAIE,EAAW,CAAE,EACbC,EAAWxE,EAAO,IAAI,EAU1B,GATIwE,EACK,MAAM,QAAQA,CAAQ,EACtBxE,EAAO,IAAI,EAAE,KAAKuE,CAAQ,EADDvE,EAAO,IAAI,EAAI,CAACwE,EAAUD,CAAQ,EAI5Db,EAAO,QAAQW,CAAQ,IAAM,GAAIrE,EAAO,IAAI,EAAI,CAACuE,CAAQ,EACxDvE,EAAO,IAAI,EAAIuE,EAGpBH,EAAQ,WAAY,QAASK,KAAaL,EAAQ,WAAYG,EAASR,EAAWU,EAAU,QAAQ,CAAC,EAAIT,EAAYS,EAAU,SAAUA,EAAU,SAAS,EAEhK,QAASC,KAAQN,EAAQ,WAAYD,EAAUO,EAAMH,CAAQ,CAChE,CAED,IAAIvE,EAAS,CAAA,EACb,QAAS0E,KAAQR,EAAI,WAAYC,EAAUO,EAAM1E,CAAM,EAEvD,OAAOA,CACV,CACL,CCpHe,MAAA2E,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECGT,CAAE,OAAAC,CAAQ,EAAGxC,EAEJ,MAAMyC,UAA6B1C,CAAkB,CAchE,YAAYsB,EAAS,CACjB,QA0DJ1B,EAAA,0BAAqB+C,GAAS,CAC1B,MAAMC,EAAQ,KAAK,OAAO,cAAc,OAAO,EAC3CA,GACAA,EAAM,UAAU,OAAO,WAAYD,CAAK,CAE/C,GAgCD/C,EAAA,cAAS,IAAM,CACX,MAAMiD,EAAe,KAAK,OAAO,cAAc,OAAO,EACtD,GAAI,CAAC,KAAK,SAAU,CAChB,MAAMC,EAAaD,EAAa,sBAAqB,EAAG,MAClDE,EAAgB,SAAS,iBAAiBF,CAAY,EAAE,cAAc,MAAM,IAAI,EAAE,CAAC,CAAC,EAC1F,KAAK,WAAaC,EAAaC,EAAgB,KAAK,SAAW,KAAK,OAAS,EAChF,CAEG,KAAK,UAAY,IACjBF,EAAa,MAAM,YAAY,cAAe,GAAG,KAAK,SAAS,IAAI,EACnE,KAAK,SAAW,GAEvB,GAzGO,GAAAvB,IACA,KAAK,QAAUA,EACf,KAAK,GAAKA,EAAQ,IAGtB,KAAK,OAAS,KAAK,aAAa,CAAC,KAAM,MAAM,CAAC,EAC9C,KAAK,iBAAmB,GAEpBA,EAAS,CACT,MAAM0B,EAAa1B,EAAQ,OACvB0B,GACAA,EAAW,YAAY,IAAI,CAElC,CACJ,CA9BD,WAAW,WAAY,CACnB,MAAO,CACH,GAAInD,EAAU,OACd,MAAOA,EAAU,OACjB,MAAOA,EAAU,OACjB,QAASA,EAAU,OACnB,WAAYA,EAAU,KAAK,QAAQ,CAAA,CAAE,EAAE,SACvC,aAAcA,EAAU,KAAK,QAAQ,EAAI,EAAE,SAC3C,mBAAoBA,EAAU,OAAO,OAAO,kBAAkB,EAAE,QAAQ,EAAE,EAAE,SAC5E,YAAaA,EAAU,OAAO,QAAQ,OAAO,EAC7C,sBAAuBA,EAAU,OAAO,QAAQ,OAAO,CAC1D,CACJ,CAoBD,WAAW,oBAAqB,CAC5B,OAAOA,EAAU,YAAY,KAAK,SAAS,CAC9C,CA6CD,OAAOuB,EAAM,CACT,OAAO,KAAK,YAAY,SAASA,CAAI,CACxC,CAED,WAAY,CACR,IAAI6B,EACC,KAAK,QAGNA,EAAS,KAAK,QAAQ,OAFtBA,EAAS,KAAK,OAAO,WAIzB,MAAMC,EAAQ,KAAK,OAAS,SAASD,EAAO,KAAK,EAC3CE,EAAS,KAAK,QAAU,SAASF,EAAO,MAAM,EAE9C7B,EAAO,CACT,MAAA8B,EACA,OAAAC,EACA,QAASF,EAAO,QAAQ,MAAM,GAAG,EACjC,YAAaA,EAAO,YACpB,aAAc,KAAK,OAAO,aAC1B,mBAAoB,KAAK,OAAO,mBAAqB,KAAK,OAAO,mBAAmB,MAAM,OAAO,EAAE,IAAIlE,GAAQ,OAAOA,CAAI,CAAC,EAAI,CAAE,EACjI,YAAa,KAAK,OAAO,YACzB,sBAAuB,KAAK,OAAO,sBACnC,aAAckE,EAAO,MACrB,UAAWG,GAAOA,EAAM,GAAK,OAAO,aAAa,GAAK,KAAK,MAAMA,EAAM,EAAE,CAAC,EAAI,OAAO,aAAa,GAAKA,EAAM,EAAE,EAAI,OAAO,aAAa,GAAKA,CAAG,CAClJ,EACD,KAAK,OAAO,UAAY,KAAK,OAAOhC,CAAI,EACxC,KAAK,OAAM,CACd,CAgBD,mBAAoB,CAChB,KAAK,OAASvB,EAAU,kBAAkB,IAAI,EAC9C,KAAK,UAAS,EACd,KAAK,eAAiB,IAAI,eAAe,KAAK,MAAM,EACpD,KAAK,eAAe,QAAQ,IAAI,EAChC,KAAK,iBAAmB,GACxBC,EAAW,UAAU,KAAK,kBAAkB,CAC/C,CAED,sBAAuB,CACnBA,EAAW,YAAY,KAAK,kBAAkB,EAC9C,KAAK,eAAe,YACvB,CAED,yBAAyBuD,EAAUC,EAAQC,EAAQ,CAC3C,KAAK,mBACL,KAAK,OAAS,CAAC,GAAG,KAAK,OAAQ,GAAG1D,EAAU,kBAAkB,KAAMwD,CAAQ,CAAC,EAC7E,KAAK,UAAS,EAErB,CACL,CA3GI,OAAAzD,EArCiB8C,EAqCV,WAAWtB,GAAQ;AAAA;AAAA;AAAA,MAGxBoB,CAAM;AAAA;AAAA,MAENpB,EAAK,YAAY,IAAIrC,GAAQ,2BAA2BA,EAAK,EAAE,yBAAyBA,EAAK,OAAO,YAAa,CAAA,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA;AAAA;AAAA,iBAGpHqC,EAAK,WAAW;AAAA,4BACLA,EAAK,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAMjBtB,EAAW,MAAQ,WAAa,EAAE;AAAA;AAAA;AAAA;AAAA,sBAIjD2C,EAAOrB,EAAK,MAAOoC,GAAO,sCAAsCA,EAAM,CAAC,OAAO,CAAC;AAAA;AAAA,kBAEnFf,EAAOrB,EAAK,OAAQgC,GAAO,0CAA0ChC,EAAK,UAAUgC,EAAM,CAAC,CAAC,QAAQX,EAAOrB,EAAK,MAAOoC,GAAO,CAC5H,MAAMC,EAAYL,EAAIhC,EAAK,aAAeoC,EACpCE,EAAgBtC,EAAK,cAAgBA,EAAK,mBAAmB,SAASqC,EAAY,CAAC,EAAI,WAAa,GAEpGE,EAAavC,EAAK,QAAQ,MAAK,EACrC,IAAIwC,EAASxC,EAAK,QAAQ,MAAK,EAC/B,OAAIuC,IAAe,KAAOC,IAAW,OACjCA,EAAS,UAEN,yBAAyBD,CAAU,6BAA6BD,CAAa,KAAKE,CAAM,OACnH,CAAiB,CAAC,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,GCvE1B,eAAe,OAAO,yBAA0BlB,CAAoB"}