UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 23.5 kB
{"version":3,"file":"node.mjs","names":["isUndefined"],"sources":["../../../../../../../packages/components/tree/src/model/node.ts"],"sourcesContent":["import { reactive } from 'vue'\nimport { isNil } from 'lodash-unified'\nimport {\n hasOwn,\n isArray,\n isBoolean,\n isFunction,\n isString,\n isUndefined,\n} from '@element-plus/utils'\nimport { NODE_KEY, markNodeData } from './util'\n\nimport type TreeStore from './tree-store'\nimport type { Nullable } from '@element-plus/utils'\nimport type {\n FakeNode,\n TreeKey,\n TreeNodeChildState,\n TreeNodeData,\n TreeNodeLoadedDefaultProps,\n TreeNodeOptions,\n} from '../tree.type'\n\nexport const getChildState = (node: Node[]): TreeNodeChildState => {\n let all = true\n let none = true\n let allWithoutDisable = true\n let isEffectivelyChecked = true\n for (let i = 0, j = node.length; i < j; i++) {\n const n = node[i]\n if (n.checked !== true || n.indeterminate) {\n all = false\n if (!n.disabled) {\n allWithoutDisable = false\n }\n }\n if (n.checked !== false || n.indeterminate) {\n none = false\n }\n if (!n.isEffectivelyChecked) {\n isEffectivelyChecked = false\n }\n }\n\n return {\n all,\n none,\n allWithoutDisable,\n half: !all && !none,\n isEffectivelyChecked,\n }\n}\n\nconst reInitChecked = function (node: Node): void {\n if (node.childNodes.length === 0 || node.loading) {\n node.isEffectivelyChecked = node.disabled || node.checked\n return\n }\n\n const { all, none, half, isEffectivelyChecked } = getChildState(\n node.childNodes\n )\n node.isEffectivelyChecked = isEffectivelyChecked\n if (all) {\n node.checked = true\n node.indeterminate = false\n } else if (half) {\n node.checked = false\n node.indeterminate = true\n } else if (none) {\n node.checked = false\n node.indeterminate = false\n }\n\n const parent = node.parent\n if (!parent || parent.level === 0) return\n\n if (!node.store.checkStrictly) {\n reInitChecked(parent)\n }\n}\n\nconst getPropertyFromData = function (node: Node, prop: string): any {\n const props = node.store.props\n const data = node.data || {}\n const config = (props as any)[prop]\n\n if (isFunction(config)) {\n return config(data, node)\n } else if (isString(config)) {\n return data[config]\n } else if (isUndefined(config)) {\n const dataProp = data[prop]\n return isUndefined(dataProp) ? '' : dataProp\n }\n}\n\nconst setCanFocus = function (childNodes: Node[], focus: boolean): void {\n childNodes.forEach((item) => {\n item.canFocus = focus\n setCanFocus(item.childNodes, focus)\n })\n}\n\nlet nodeIdSeed = 0\n\nclass Node {\n id: number\n text: string | null\n checked: boolean\n indeterminate: boolean\n data: TreeNodeData\n expanded: boolean\n parent: Node | null\n visible: boolean\n isCurrent: boolean\n store!: TreeStore\n isLeafByUser: boolean | undefined = undefined\n isLeaf: boolean | undefined = undefined\n canFocus: boolean\n\n level: number\n loaded: boolean\n childNodes: Node[]\n loading: boolean\n\n /**\n * Determines whether the current tree node is effectively checked.\n *\n * Rules:\n * 1. A disabled leaf node is always considered checked.\n * 2. A non-disabled leaf node reflects its actual checked state.\n * 3. A non-leaf node is considered checked only when:\n * - All of its child nodes are effectively checked, and\n * - Each child follows the same evaluation rules:\n * - Disabled leaf nodes follow rule #1.\n * - Non-leaf child nodes are recursively evaluated under this rule (#3).\n */\n isEffectivelyChecked: boolean = false\n\n constructor(options: TreeNodeOptions) {\n this.id = nodeIdSeed++\n this.text = null\n this.checked = false\n this.indeterminate = false\n this.data = null as unknown as TreeNodeData\n this.expanded = false\n this.parent = null as Node | null\n this.visible = true\n this.isCurrent = false\n this.canFocus = false\n\n for (const name in options) {\n if (hasOwn(options, name)) {\n this[name] = options[name]\n }\n }\n\n // internal\n this.level = 0\n this.loaded = false\n this.childNodes = []\n this.loading = false\n\n if (this.parent) {\n this.level = this.parent.level + 1\n }\n }\n\n initialize() {\n const store = this.store\n if (!store) {\n throw new Error('[Node]store is required!')\n }\n store.registerNode(this)\n\n const props = store.props\n if (props && typeof props.isLeaf !== 'undefined') {\n const isLeaf = getPropertyFromData(this, 'isLeaf')\n if (isBoolean(isLeaf)) {\n this.isLeafByUser = isLeaf\n }\n }\n\n if (store.lazy !== true && this.data) {\n this.setData(this.data)\n\n if (store.defaultExpandAll) {\n this.expanded = true\n this.canFocus = true\n }\n } else if (\n this.level > 0 &&\n store.lazy &&\n store.defaultExpandAll &&\n !this.isLeafByUser\n ) {\n this.expand()\n }\n if (!isArray(this.data)) {\n markNodeData(this, this.data)\n }\n if (!this.data) return\n\n const defaultExpandedKeys = store.defaultExpandedKeys\n const key = store.key\n\n if (\n key &&\n !isNil(this.key) &&\n defaultExpandedKeys &&\n defaultExpandedKeys.includes(this.key)\n ) {\n this.expand(null, store.autoExpandParent)\n }\n\n if (\n key &&\n store.currentNodeKey !== undefined &&\n this.key === store.currentNodeKey\n ) {\n store.currentNode && (store.currentNode.isCurrent = false)\n store.currentNode = this\n store.currentNode.isCurrent = true\n }\n\n if (store.lazy) {\n store._initDefaultCheckedNode(this)\n }\n\n this.updateLeafState()\n if (this.level === 1 || this.parent?.expanded === true) this.canFocus = true\n }\n\n setData(data: TreeNodeData): void {\n if (!isArray(data)) {\n markNodeData(this, data)\n }\n\n this.data = data\n this.childNodes = []\n\n let children\n if (this.level === 0 && isArray(this.data)) {\n children = this.data\n } else {\n children = getPropertyFromData(this, 'children') || []\n }\n\n for (let i = 0, j = children.length; i < j; i++) {\n this.insertChild({ data: children[i] })\n }\n }\n\n get label(): string {\n return getPropertyFromData(this, 'label')\n }\n\n get key(): TreeKey | null | undefined {\n const nodeKey = this.store.key\n if (this.data) return this.data[nodeKey]\n return null\n }\n\n get disabled(): boolean {\n return getPropertyFromData(this, 'disabled')\n }\n\n get nextSibling(): Nullable<Node> {\n const parent = this.parent\n if (parent) {\n const index = parent.childNodes.indexOf(this)\n if (index > -1) {\n return parent.childNodes[index + 1]\n }\n }\n return null\n }\n\n get previousSibling(): Nullable<Node> {\n const parent = this.parent\n if (parent) {\n const index = parent.childNodes.indexOf(this)\n if (index > -1) {\n return index > 0 ? parent.childNodes[index - 1] : null\n }\n }\n return null\n }\n\n contains(target: Node, deep = true): boolean {\n return (this.childNodes || []).some(\n (child) => child === target || (deep && child.contains(target))\n )\n }\n\n remove(): void {\n const parent = this.parent\n if (parent) {\n parent.removeChild(this)\n }\n }\n\n insertChild(child?: FakeNode | Node, index?: number, batch?: boolean): void {\n if (!child) throw new Error('InsertChild error: child is required.')\n\n if (!(child instanceof Node)) {\n if (!batch) {\n const children = this.getChildren(true)\n if (!children?.includes(child.data)) {\n if (isUndefined(index) || index < 0) {\n children?.push(child.data)\n } else {\n children?.splice(index, 0, child.data)\n }\n }\n }\n Object.assign(child, {\n parent: this,\n store: this.store,\n })\n child = reactive(new Node(child as TreeNodeOptions))\n if (child instanceof Node) {\n child.initialize()\n }\n }\n\n ;(child as Node).level = this.level + 1\n\n if (isUndefined(index) || index < 0) {\n this.childNodes.push(child as Node)\n } else {\n this.childNodes.splice(index, 0, child as Node)\n }\n\n this.updateLeafState()\n }\n\n insertBefore(child: FakeNode | Node, ref: Node): void {\n let index\n if (ref) {\n index = this.childNodes.indexOf(ref)\n }\n this.insertChild(child, index)\n }\n\n insertAfter(child: FakeNode | Node, ref: Node): void {\n let index\n if (ref) {\n index = this.childNodes.indexOf(ref)\n if (index !== -1) index += 1\n }\n this.insertChild(child, index)\n }\n\n removeChild(child: Node): void {\n const children = this.getChildren() || []\n const dataIndex = children.indexOf(child.data)\n if (dataIndex > -1) {\n children.splice(dataIndex, 1)\n }\n\n const index = this.childNodes.indexOf(child)\n\n if (index > -1) {\n this.store && this.store.deregisterNode(child)\n child.parent = null\n this.childNodes.splice(index, 1)\n }\n\n this.updateLeafState()\n }\n\n removeChildByData(data: TreeNodeData | null): void {\n const targetNode = this.childNodes.find((child) => child.data === data)\n\n if (targetNode) {\n this.removeChild(targetNode)\n }\n }\n\n expand(callback?: (() => void) | null, expandParent?: boolean): void {\n const done = () => {\n if (expandParent) {\n let parent = this.parent\n while (parent && parent.level > 0) {\n parent.expanded = true\n parent = parent.parent\n }\n }\n this.expanded = true\n if (callback) callback()\n setCanFocus(this.childNodes, true)\n }\n\n if (this.shouldLoadData()) {\n this.loadData((data) => {\n if (isArray(data)) {\n if (this.checked) {\n this.setChecked(true, true)\n } else if (!this.store.checkStrictly) {\n reInitChecked(this)\n }\n done()\n }\n })\n } else {\n done()\n }\n }\n\n doCreateChildren(\n array: TreeNodeData[],\n defaultProps: TreeNodeLoadedDefaultProps = {}\n ): void {\n array.forEach((item) => {\n this.insertChild(\n Object.assign({ data: item }, defaultProps),\n undefined,\n true\n )\n })\n }\n\n collapse(): void {\n this.expanded = false\n setCanFocus(this.childNodes, false)\n }\n\n shouldLoadData() {\n return Boolean(this.store.lazy === true && this.store.load && !this.loaded)\n }\n\n updateLeafState(): void {\n if (\n this.store.lazy === true &&\n this.loaded !== true &&\n typeof this.isLeafByUser !== 'undefined'\n ) {\n this.isLeaf = this.isLeafByUser\n this.isEffectivelyChecked = this.isLeaf && this.disabled\n return\n }\n const childNodes = this.childNodes\n if (\n !this.store.lazy ||\n (this.store.lazy === true && this.loaded === true)\n ) {\n this.isLeaf = !childNodes || childNodes.length === 0\n this.isEffectivelyChecked = this.isLeaf && this.disabled\n return\n }\n this.isLeaf = false\n }\n\n setChecked(\n value?: boolean | string,\n deep?: boolean,\n recursion?: boolean,\n passValue?: boolean\n ) {\n this.indeterminate = value === 'half'\n this.checked = value === true\n this.isEffectivelyChecked =\n !this.childNodes.length && (this.disabled || this.checked)\n\n if (this.store.checkStrictly) return\n\n if (!(this.shouldLoadData() && !this.store.checkDescendants)) {\n const handleDescendants = (): void => {\n if (deep) {\n const childNodes = this.childNodes\n for (let i = 0, j = childNodes.length; i < j; i++) {\n const child = childNodes[i]\n passValue = passValue || value !== false\n const isCheck =\n child.disabled && child.isLeaf ? child.checked : passValue\n child.setChecked(isCheck, deep, true, passValue)\n }\n const { half, all, isEffectivelyChecked } = getChildState(childNodes)\n if (!all) {\n this.checked = all\n this.indeterminate = half\n }\n this.isEffectivelyChecked = !this.childNodes.length\n ? this.disabled || this.checked\n : isEffectivelyChecked\n }\n }\n\n if (this.shouldLoadData()) {\n // Only work on lazy load data.\n this.loadData(\n () => {\n handleDescendants()\n reInitChecked(this)\n },\n {\n checked: value !== false,\n }\n )\n return\n } else {\n handleDescendants()\n }\n }\n\n const parent = this.parent\n if (!parent || parent.level === 0) return\n\n if (!recursion) {\n reInitChecked(parent)\n }\n }\n\n getChildren(forceInit = false): TreeNodeData | TreeNodeData[] | null {\n // this is data\n if (this.level === 0) return this.data\n const data = this.data\n if (!data) return null\n\n const props = this.store.props\n let children = 'children'\n if (props) {\n children = props.children || 'children'\n }\n\n if (isUndefined(data[children])) {\n data[children] = null\n }\n\n if (forceInit && !data[children]) {\n data[children] = []\n }\n\n return data[children]\n }\n\n updateChildren(): void {\n const newData = (this.getChildren() || []) as TreeNodeData[]\n const oldData = this.childNodes.map((node) => node.data)\n\n const newDataMap: Record<TreeKey, TreeNodeData> = {}\n const newNodes: TreeNodeData[] = []\n\n newData.forEach((item, index) => {\n const key = item[NODE_KEY]\n const isNodeExists =\n !!key && oldData.some((data) => data?.[NODE_KEY] === key)\n if (isNodeExists) {\n newDataMap[key] = { index, data: item }\n } else {\n newNodes.push({ index, data: item })\n }\n })\n\n if (!this.store.lazy) {\n oldData.forEach((item) => {\n if (!newDataMap[item?.[NODE_KEY]]) this.removeChildByData(item)\n })\n }\n\n newNodes.forEach(({ index, data }) => {\n this.insertChild({ data }, index)\n })\n\n this.updateLeafState()\n }\n\n loadData(\n callback: (data?: TreeNodeData[]) => void,\n defaultProps: TreeNodeLoadedDefaultProps = {}\n ) {\n if (\n this.store.lazy === true &&\n this.store.load &&\n !this.loaded &&\n (!this.loading || Object.keys(defaultProps).length)\n ) {\n this.loading = true\n\n const resolve = (children: TreeNodeData[]) => {\n this.childNodes = []\n\n this.doCreateChildren(children, defaultProps)\n this.loaded = true\n this.loading = false\n\n this.updateLeafState()\n if (callback) {\n callback.call(this, children)\n }\n }\n const reject = () => {\n this.loading = false\n }\n\n this.store.load(this, resolve, reject)\n } else {\n if (callback) {\n callback.call(this)\n }\n }\n }\n\n eachNode(callback: (node: Node) => void) {\n const arr: Node[] = [this]\n while (arr.length) {\n const node = arr.shift()!\n arr.unshift(...node.childNodes)\n callback(node)\n }\n }\n\n reInitChecked() {\n if (this.store.checkStrictly) return\n reInitChecked(this)\n }\n}\n\nexport default Node\n"],"mappings":";;;;;;;AAuBA,MAAa,iBAAiB,SAAqC;CACjE,IAAI,MAAM;CACV,IAAI,OAAO;CACX,IAAI,oBAAoB;CACxB,IAAI,uBAAuB;AAC3B,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,GAAG,KAAK;EAC3C,MAAM,IAAI,KAAK;AACf,MAAI,EAAE,YAAY,QAAQ,EAAE,eAAe;AACzC,SAAM;AACN,OAAI,CAAC,EAAE,SACL,qBAAoB;;AAGxB,MAAI,EAAE,YAAY,SAAS,EAAE,cAC3B,QAAO;AAET,MAAI,CAAC,EAAE,qBACL,wBAAuB;;AAI3B,QAAO;EACL;EACA;EACA;EACA,MAAM,CAAC,OAAO,CAAC;EACf;EACD;;AAGH,MAAM,gBAAgB,SAAU,MAAkB;AAChD,KAAI,KAAK,WAAW,WAAW,KAAK,KAAK,SAAS;AAChD,OAAK,uBAAuB,KAAK,YAAY,KAAK;AAClD;;CAGF,MAAM,EAAE,KAAK,MAAM,MAAM,yBAAyB,cAChD,KAAK,WACN;AACD,MAAK,uBAAuB;AAC5B,KAAI,KAAK;AACP,OAAK,UAAU;AACf,OAAK,gBAAgB;YACZ,MAAM;AACf,OAAK,UAAU;AACf,OAAK,gBAAgB;YACZ,MAAM;AACf,OAAK,UAAU;AACf,OAAK,gBAAgB;;CAGvB,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,OAAO,UAAU,EAAG;AAEnC,KAAI,CAAC,KAAK,MAAM,cACd,eAAc,OAAO;;AAIzB,MAAM,sBAAsB,SAAU,MAAY,MAAmB;CACnE,MAAM,QAAQ,KAAK,MAAM;CACzB,MAAM,OAAO,KAAK,QAAQ,EAAE;CAC5B,MAAM,SAAU,MAAc;AAE9B,KAAI,WAAW,OAAO,CACpB,QAAO,OAAO,MAAM,KAAK;UAChB,SAAS,OAAO,CACzB,QAAO,KAAK;UACHA,cAAY,OAAO,EAAE;EAC9B,MAAM,WAAW,KAAK;AACtB,SAAOA,cAAY,SAAS,GAAG,KAAK;;;AAIxC,MAAM,cAAc,SAAU,YAAoB,OAAsB;AACtE,YAAW,SAAS,SAAS;AAC3B,OAAK,WAAW;AAChB,cAAY,KAAK,YAAY,MAAM;GACnC;;AAGJ,IAAI,aAAa;AAEjB,IAAM,OAAN,MAAM,KAAK;CAkCT,YAAY,SAA0B;sBAvBF;gBACN;8BAoBE;AAG9B,OAAK,KAAK;AACV,OAAK,OAAO;AACZ,OAAK,UAAU;AACf,OAAK,gBAAgB;AACrB,OAAK,OAAO;AACZ,OAAK,WAAW;AAChB,OAAK,SAAS;AACd,OAAK,UAAU;AACf,OAAK,YAAY;AACjB,OAAK,WAAW;AAEhB,OAAK,MAAM,QAAQ,QACjB,KAAI,OAAO,SAAS,KAAK,CACvB,MAAK,QAAQ,QAAQ;AAKzB,OAAK,QAAQ;AACb,OAAK,SAAS;AACd,OAAK,aAAa,EAAE;AACpB,OAAK,UAAU;AAEf,MAAI,KAAK,OACP,MAAK,QAAQ,KAAK,OAAO,QAAQ;;CAIrC,aAAa;EACX,MAAM,QAAQ,KAAK;AACnB,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,2BAA2B;AAE7C,QAAM,aAAa,KAAK;EAExB,MAAM,QAAQ,MAAM;AACpB,MAAI,SAAS,OAAO,MAAM,WAAW,aAAa;GAChD,MAAM,SAAS,oBAAoB,MAAM,SAAS;AAClD,OAAI,UAAU,OAAO,CACnB,MAAK,eAAe;;AAIxB,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM;AACpC,QAAK,QAAQ,KAAK,KAAK;AAEvB,OAAI,MAAM,kBAAkB;AAC1B,SAAK,WAAW;AAChB,SAAK,WAAW;;aAGlB,KAAK,QAAQ,KACb,MAAM,QACN,MAAM,oBACN,CAAC,KAAK,aAEN,MAAK,QAAQ;AAEf,MAAI,CAAC,QAAQ,KAAK,KAAK,CACrB,cAAa,MAAM,KAAK,KAAK;AAE/B,MAAI,CAAC,KAAK,KAAM;EAEhB,MAAM,sBAAsB,MAAM;EAClC,MAAM,MAAM,MAAM;AAElB,MACE,OACA,CAAC,MAAM,KAAK,IAAI,IAChB,uBACA,oBAAoB,SAAS,KAAK,IAAI,CAEtC,MAAK,OAAO,MAAM,MAAM,iBAAiB;AAG3C,MACE,OACA,MAAM,mBAAmB,UACzB,KAAK,QAAQ,MAAM,gBACnB;AACA,SAAM,gBAAgB,MAAM,YAAY,YAAY;AACpD,SAAM,cAAc;AACpB,SAAM,YAAY,YAAY;;AAGhC,MAAI,MAAM,KACR,OAAM,wBAAwB,KAAK;AAGrC,OAAK,iBAAiB;AACtB,MAAI,KAAK,UAAU,KAAK,KAAK,QAAQ,aAAa,KAAM,MAAK,WAAW;;CAG1E,QAAQ,MAA0B;AAChC,MAAI,CAAC,QAAQ,KAAK,CAChB,cAAa,MAAM,KAAK;AAG1B,OAAK,OAAO;AACZ,OAAK,aAAa,EAAE;EAEpB,IAAI;AACJ,MAAI,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,CACxC,YAAW,KAAK;MAEhB,YAAW,oBAAoB,MAAM,WAAW,IAAI,EAAE;AAGxD,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,IAAI,GAAG,IAC1C,MAAK,YAAY,EAAE,MAAM,SAAS,IAAI,CAAC;;CAI3C,IAAI,QAAgB;AAClB,SAAO,oBAAoB,MAAM,QAAQ;;CAG3C,IAAI,MAAkC;EACpC,MAAM,UAAU,KAAK,MAAM;AAC3B,MAAI,KAAK,KAAM,QAAO,KAAK,KAAK;AAChC,SAAO;;CAGT,IAAI,WAAoB;AACtB,SAAO,oBAAoB,MAAM,WAAW;;CAG9C,IAAI,cAA8B;EAChC,MAAM,SAAS,KAAK;AACpB,MAAI,QAAQ;GACV,MAAM,QAAQ,OAAO,WAAW,QAAQ,KAAK;AAC7C,OAAI,QAAQ,GACV,QAAO,OAAO,WAAW,QAAQ;;AAGrC,SAAO;;CAGT,IAAI,kBAAkC;EACpC,MAAM,SAAS,KAAK;AACpB,MAAI,QAAQ;GACV,MAAM,QAAQ,OAAO,WAAW,QAAQ,KAAK;AAC7C,OAAI,QAAQ,GACV,QAAO,QAAQ,IAAI,OAAO,WAAW,QAAQ,KAAK;;AAGtD,SAAO;;CAGT,SAAS,QAAc,OAAO,MAAe;AAC3C,UAAQ,KAAK,cAAc,EAAE,EAAE,MAC5B,UAAU,UAAU,UAAW,QAAQ,MAAM,SAAS,OAAO,CAC/D;;CAGH,SAAe;EACb,MAAM,SAAS,KAAK;AACpB,MAAI,OACF,QAAO,YAAY,KAAK;;CAI5B,YAAY,OAAyB,OAAgB,OAAuB;AAC1E,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wCAAwC;AAEpE,MAAI,EAAE,iBAAiB,OAAO;AAC5B,OAAI,CAAC,OAAO;IACV,MAAM,WAAW,KAAK,YAAY,KAAK;AACvC,QAAI,CAAC,UAAU,SAAS,MAAM,KAAK,CACjC,KAAIA,cAAY,MAAM,IAAI,QAAQ,EAChC,WAAU,KAAK,MAAM,KAAK;QAE1B,WAAU,OAAO,OAAO,GAAG,MAAM,KAAK;;AAI5C,UAAO,OAAO,OAAO;IACnB,QAAQ;IACR,OAAO,KAAK;IACb,CAAC;AACF,WAAQ,SAAS,IAAI,KAAK,MAAyB,CAAC;AACpD,OAAI,iBAAiB,KACnB,OAAM,YAAY;;AAIrB,EAAC,MAAe,QAAQ,KAAK,QAAQ;AAEtC,MAAIA,cAAY,MAAM,IAAI,QAAQ,EAChC,MAAK,WAAW,KAAK,MAAc;MAEnC,MAAK,WAAW,OAAO,OAAO,GAAG,MAAc;AAGjD,OAAK,iBAAiB;;CAGxB,aAAa,OAAwB,KAAiB;EACpD,IAAI;AACJ,MAAI,IACF,SAAQ,KAAK,WAAW,QAAQ,IAAI;AAEtC,OAAK,YAAY,OAAO,MAAM;;CAGhC,YAAY,OAAwB,KAAiB;EACnD,IAAI;AACJ,MAAI,KAAK;AACP,WAAQ,KAAK,WAAW,QAAQ,IAAI;AACpC,OAAI,UAAU,GAAI,UAAS;;AAE7B,OAAK,YAAY,OAAO,MAAM;;CAGhC,YAAY,OAAmB;EAC7B,MAAM,WAAW,KAAK,aAAa,IAAI,EAAE;EACzC,MAAM,YAAY,SAAS,QAAQ,MAAM,KAAK;AAC9C,MAAI,YAAY,GACd,UAAS,OAAO,WAAW,EAAE;EAG/B,MAAM,QAAQ,KAAK,WAAW,QAAQ,MAAM;AAE5C,MAAI,QAAQ,IAAI;AACd,QAAK,SAAS,KAAK,MAAM,eAAe,MAAM;AAC9C,SAAM,SAAS;AACf,QAAK,WAAW,OAAO,OAAO,EAAE;;AAGlC,OAAK,iBAAiB;;CAGxB,kBAAkB,MAAiC;EACjD,MAAM,aAAa,KAAK,WAAW,MAAM,UAAU,MAAM,SAAS,KAAK;AAEvE,MAAI,WACF,MAAK,YAAY,WAAW;;CAIhC,OAAO,UAAgC,cAA8B;EACnE,MAAM,aAAa;AACjB,OAAI,cAAc;IAChB,IAAI,SAAS,KAAK;AAClB,WAAO,UAAU,OAAO,QAAQ,GAAG;AACjC,YAAO,WAAW;AAClB,cAAS,OAAO;;;AAGpB,QAAK,WAAW;AAChB,OAAI,SAAU,WAAU;AACxB,eAAY,KAAK,YAAY,KAAK;;AAGpC,MAAI,KAAK,gBAAgB,CACvB,MAAK,UAAU,SAAS;AACtB,OAAI,QAAQ,KAAK,EAAE;AACjB,QAAI,KAAK,QACP,MAAK,WAAW,MAAM,KAAK;aAClB,CAAC,KAAK,MAAM,cACrB,eAAc,KAAK;AAErB,UAAM;;IAER;MAEF,OAAM;;CAIV,iBACE,OACA,eAA2C,EAAE,EACvC;AACN,QAAM,SAAS,SAAS;AACtB,QAAK,YACH,OAAO,OAAO,EAAE,MAAM,MAAM,EAAE,aAAa,EAC3C,QACA,KACD;IACD;;CAGJ,WAAiB;AACf,OAAK,WAAW;AAChB,cAAY,KAAK,YAAY,MAAM;;CAGrC,iBAAiB;AACf,SAAO,QAAQ,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC,KAAK,OAAO;;CAG7E,kBAAwB;AACtB,MACE,KAAK,MAAM,SAAS,QACpB,KAAK,WAAW,QAChB,OAAO,KAAK,iBAAiB,aAC7B;AACA,QAAK,SAAS,KAAK;AACnB,QAAK,uBAAuB,KAAK,UAAU,KAAK;AAChD;;EAEF,MAAM,aAAa,KAAK;AACxB,MACE,CAAC,KAAK,MAAM,QACX,KAAK,MAAM,SAAS,QAAQ,KAAK,WAAW,MAC7C;AACA,QAAK,SAAS,CAAC,cAAc,WAAW,WAAW;AACnD,QAAK,uBAAuB,KAAK,UAAU,KAAK;AAChD;;AAEF,OAAK,SAAS;;CAGhB,WACE,OACA,MACA,WACA,WACA;AACA,OAAK,gBAAgB,UAAU;AAC/B,OAAK,UAAU,UAAU;AACzB,OAAK,uBACH,CAAC,KAAK,WAAW,WAAW,KAAK,YAAY,KAAK;AAEpD,MAAI,KAAK,MAAM,cAAe;AAE9B,MAAI,EAAE,KAAK,gBAAgB,IAAI,CAAC,KAAK,MAAM,mBAAmB;GAC5D,MAAM,0BAAgC;AACpC,QAAI,MAAM;KACR,MAAM,aAAa,KAAK;AACxB,UAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,IAAI,GAAG,KAAK;MACjD,MAAM,QAAQ,WAAW;AACzB,kBAAY,aAAa,UAAU;MACnC,MAAM,UACJ,MAAM,YAAY,MAAM,SAAS,MAAM,UAAU;AACnD,YAAM,WAAW,SAAS,MAAM,MAAM,UAAU;;KAElD,MAAM,EAAE,MAAM,KAAK,yBAAyB,cAAc,WAAW;AACrE,SAAI,CAAC,KAAK;AACR,WAAK,UAAU;AACf,WAAK,gBAAgB;;AAEvB,UAAK,uBAAuB,CAAC,KAAK,WAAW,SACzC,KAAK,YAAY,KAAK,UACtB;;;AAIR,OAAI,KAAK,gBAAgB,EAAE;AAEzB,SAAK,eACG;AACJ,wBAAmB;AACnB,mBAAc,KAAK;OAErB,EACE,SAAS,UAAU,OACpB,CACF;AACD;SAEA,oBAAmB;;EAIvB,MAAM,SAAS,KAAK;AACpB,MAAI,CAAC,UAAU,OAAO,UAAU,EAAG;AAEnC,MAAI,CAAC,UACH,eAAc,OAAO;;CAIzB,YAAY,YAAY,OAA6C;AAEnE,MAAI,KAAK,UAAU,EAAG,QAAO,KAAK;EAClC,MAAM,OAAO,KAAK;AAClB,MAAI,CAAC,KAAM,QAAO;EAElB,MAAM,QAAQ,KAAK,MAAM;EACzB,IAAI,WAAW;AACf,MAAI,MACF,YAAW,MAAM,YAAY;AAG/B,MAAIA,cAAY,KAAK,UAAU,CAC7B,MAAK,YAAY;AAGnB,MAAI,aAAa,CAAC,KAAK,UACrB,MAAK,YAAY,EAAE;AAGrB,SAAO,KAAK;;CAGd,iBAAuB;EACrB,MAAM,UAAW,KAAK,aAAa,IAAI,EAAE;EACzC,MAAM,UAAU,KAAK,WAAW,KAAK,SAAS,KAAK,KAAK;EAExD,MAAM,aAA4C,EAAE;EACpD,MAAM,WAA2B,EAAE;AAEnC,UAAQ,SAAS,MAAM,UAAU;GAC/B,MAAM,MAAM,KAAK;AAGjB,OADE,CAAC,CAAC,OAAO,QAAQ,MAAM,SAAS,OAAO,cAAc,IAAI,CAEzD,YAAW,OAAO;IAAE;IAAO,MAAM;IAAM;OAEvC,UAAS,KAAK;IAAE;IAAO,MAAM;IAAM,CAAC;IAEtC;AAEF,MAAI,CAAC,KAAK,MAAM,KACd,SAAQ,SAAS,SAAS;AACxB,OAAI,CAAC,WAAW,OAAO,WAAY,MAAK,kBAAkB,KAAK;IAC/D;AAGJ,WAAS,SAAS,EAAE,OAAO,WAAW;AACpC,QAAK,YAAY,EAAE,MAAM,EAAE,MAAM;IACjC;AAEF,OAAK,iBAAiB;;CAGxB,SACE,UACA,eAA2C,EAAE,EAC7C;AACA,MACE,KAAK,MAAM,SAAS,QACpB,KAAK,MAAM,QACX,CAAC,KAAK,WACL,CAAC,KAAK,WAAW,OAAO,KAAK,aAAa,CAAC,SAC5C;AACA,QAAK,UAAU;GAEf,MAAM,WAAW,aAA6B;AAC5C,SAAK,aAAa,EAAE;AAEpB,SAAK,iBAAiB,UAAU,aAAa;AAC7C,SAAK,SAAS;AACd,SAAK,UAAU;AAEf,SAAK,iBAAiB;AACtB,QAAI,SACF,UAAS,KAAK,MAAM,SAAS;;GAGjC,MAAM,eAAe;AACnB,SAAK,UAAU;;AAGjB,QAAK,MAAM,KAAK,MAAM,SAAS,OAAO;aAElC,SACF,UAAS,KAAK,KAAK;;CAKzB,SAAS,UAAgC;EACvC,MAAM,MAAc,CAAC,KAAK;AAC1B,SAAO,IAAI,QAAQ;GACjB,MAAM,OAAO,IAAI,OAAO;AACxB,OAAI,QAAQ,GAAG,KAAK,WAAW;AAC/B,YAAS,KAAK;;;CAIlB,gBAAgB;AACd,MAAI,KAAK,MAAM,cAAe;AAC9B,gBAAc,KAAK"}