UNPKG

mushonkey

Version:

Simple central node Sankey designed by @mushon. openbudget.github.io/mushonkey

1 lines 30.9 kB
{"version":3,"file":"mushonkey.mjs","sources":["../../../projects/mushonkey/src/lib/mushonkey.component.ts","../../../projects/mushonkey/src/lib/mushonkey.module.ts","../../../projects/mushonkey/src/public-api.ts","../../../projects/mushonkey/src/mushonkey.ts"],"sourcesContent":["import {\n Component, OnInit, OnChanges, ViewChild, ElementRef, Input, ViewEncapsulation, Output,\n EventEmitter,\n AfterViewInit\n} from '@angular/core';\nimport { select as d3Select, Selection } from 'd3-selection';\nimport { max as d3Max } from 'd3-array';\nimport { scaleLinear as d3ScaleLinear } from 'd3-scale';\nimport { path as d3Path } from 'd3-path';\n\nconst debug = false;\n\nexport class MushonKeyFlow {\n public size: number;\n public scaledSize: number;\n public label: string;\n public context: any;\n public group: MushonKeyFlowGroup;\n public centerOfs: number;\n public sideOfs: number;\n\n constructor(size: number,\n label: string,\n context: any)\n {\n this.size = size;\n this.label = label;\n this.context = context;\n }\n}\n\nexport class MushonKeyFlowGroup {\n public leftSide: boolean;\n public offset: number;\n public flows: Array<MushonKeyFlow>;\n public klass: string;\n public labelTextSize: number;\n public width: number;\n public widthPx: number;\n public slope: number;\n public roundness: number;\n public headLength: number;\n public tailLength: number;\n public headLengthPx: number;\n public tailLengthPx: number;\n\n constructor(leftSide: boolean,\n flows: Array<MushonKeyFlow>,\n klass: string,\n offset?: number,\n width?: number,\n slope?: number,\n roundness?: number,\n headLength?: number,\n tailLength?: number,\n labelTextSize?: number,\n )\n {\n this.leftSide = leftSide;\n this.flows = flows;\n this.klass = klass;\n this.labelTextSize = labelTextSize || 20;\n this.offset = offset || 200;\n this.width = width || 1.0;\n this.slope = slope || 1.0;\n this.roundness = roundness || 9;\n this.headLength = headLength || 0.25;\n this.tailLength = tailLength || 0.25;\n\n for (let flow of flows) {\n flow.group = this;\n }\n }\n}\n\nexport class MushonKeyChart {\n public groups: Array<MushonKeyFlowGroup>;\n public centerText: string;\n public centerWidth: number;\n public centerHeight: number;\n public centerDirectionLeft: boolean;\n public margin: any;\n public centerVerticalOffset: number;\n\n constructor(groups: Array<MushonKeyFlowGroup>,\n centerText?: string,\n centerWidth?: number,\n centerHeight?: number,\n centerDirectionLeft?: boolean,\n margin?: any,\n centerVerticalOffset?: number) {\n this.groups = groups;\n this.centerText = centerText || '';\n this.centerHeight = centerHeight || 150;\n this.centerWidth = centerWidth || 200;\n this.centerDirectionLeft = centerDirectionLeft == null ? true : centerDirectionLeft;\n this.margin = margin || {top: 20, bottom: 20, left: 20, right: 20}\n this.centerVerticalOffset = centerVerticalOffset || 0;\n }\n}\n\n@Component({\n selector: 'mushonkey',\n template: ``,\n styles: [`:host {\n width: 100%;\n height: 100%;\n display: block;\n }\n `],\n standalone: false\n})\nexport class MushonkeyComponent implements OnInit, OnChanges, AfterViewInit {\n // @ViewChild('el') private el: ElementRef;\n @Input('chart') chart: MushonKeyChart;\n @Output() onSelected = new EventEmitter<any>();\n\n private layout: Array<MushonKeyFlow> = [];\n\n private connectorWidth: number;\n private center: number;\n private centerOfs: number;\n private textIndent: number = 30;\n\n private minSideHeight: number = 20;\n private sideSeparation: number = 30;\n private centerSeparation: number = 1;\n\n // private slope: number = 1.5;\n private centerScaleRight: any;\n private centerScaleLeft: any;\n\n private d3Chart: Selection<SVGGElement, unknown, null, undefined>;\n private width: number;\n private height: number;\n\n constructor(private el: ElementRef) {}\n\n update() {\n if (!this.el?.nativeElement) {\n return;\n }\n if (this.chart) {\n if (!this.d3Chart) {\n this.createChart();\n }\n if (this.d3Chart) {\n this.updateChart();\n }\n }\n }\n\n ngOnInit() {\n this.update();\n }\n\n ngOnChanges() {\n this.update();\n }\n\n ngAfterViewInit() {\n this.update();\n }\n\n createChart() {\n const element = this.el.nativeElement;\n this.width = element.offsetWidth - this.chart.margin.left - this.chart.margin.right;\n this.height = element.offsetHeight - this.chart.margin.top - this.chart.margin.bottom;\n this.connectorWidth = this.width / 2;\n\n const svg = d3Select(element).append('svg')\n .attr('width', element.offsetWidth)\n .attr('height', element.offsetHeight);\n\n // chart plot area\n this.d3Chart = svg.append('g')\n .attr('class', 'mushonkey')\n .attr('transform', `translate(${this.chart.margin.left}, ${this.chart.margin.top})`);\n this.d3Chart.append('g')\n .attr('class', 'connectors');\n this.d3Chart.append('g')\n .attr('class', 'centerpiece-container');\n this.d3Chart.append('g')\n .attr('class', 'labels');\n }\n\n processData() {\n let leftSum = 0,\n rightSum = 0,\n leftCount = 0,\n rightCount= 0;\n let groups = this.chart.groups;\n for (let group of groups) {\n group.widthPx = group.width * this.connectorWidth;\n group.widthPx -= this.chart.centerWidth / 2;\n group.headLengthPx = group.headLength * group.widthPx;\n group.tailLengthPx = group.tailLength * group.widthPx;\n for (let flow of group.flows) {\n if (group.leftSide) {\n leftCount += 1;\n leftSum += flow.size;\n } else {\n rightCount += 1;\n rightSum += flow.size;\n }\n }\n }\n if (leftSum == 0) { leftSum = 1; }\n if (rightSum == 0) { rightSum = 1; }\n if (leftCount == 0) { leftCount = 1; }\n if (rightCount == 0) { rightCount = 1; }\n\n this.centerScaleLeft = d3ScaleLinear().domain([0, leftSum]).range([0, this.chart.centerHeight - this.centerSeparation*(leftCount - 1)]);\n this.centerScaleRight = d3ScaleLinear().domain([0, rightSum]).range([0, this.chart.centerHeight - this.centerSeparation*(rightCount - 1)]);\n\n if (this.chart.centerVerticalOffset) {\n this.centerOfs = this.chart.centerVerticalOffset;\n } else {\n if (this.chart.groups.length > 0) {\n this.centerOfs = <number>d3Max(this.chart.groups, g => -g.offset);\n } else {\n this.centerOfs = 0;\n }\n }\n this.centerOfs = this.centerOfs < 0 ? 0 : this.centerOfs;\n this.center = this.centerOfs + this.chart.centerHeight / 2;\n\n let leftOfs = {\n centerOfs: this.centerOfs,\n sideOfs: 0\n };\n\n let rightOfs = {\n centerOfs: this.centerOfs,\n sideOfs: 0\n };\n\n this.layout=[];\n for (let group of groups) {\n let ofs = group.leftSide ? leftOfs : rightOfs;\n ofs.sideOfs = this.center + group.offset;\n for (let flow of group.flows) {\n let scaledWidth;\n if (group.leftSide) {\n scaledWidth = this.centerScaleLeft(flow.size);\n } else {\n scaledWidth = this.centerScaleRight(flow.size);\n }\n flow.scaledSize = scaledWidth;\n flow.centerOfs = ofs.centerOfs + scaledWidth/2;\n flow.sideOfs = ofs.sideOfs + scaledWidth/2;\n this.layout.push(flow);\n ofs.centerOfs += scaledWidth + this.centerSeparation;\n ofs.sideOfs += <number>d3Max([scaledWidth + this.sideSeparation, this.minSideHeight])\n }\n }\n\n }\n\n generatePath(d: MushonKeyFlow) {\n let p=d3Path();\n let diffY = d.sideOfs - d.centerOfs,\n down = diffY > 0 ? 1 : -1,\n r = d.group.headLengthPx / Math.tan(Math.atan(1/d.group.slope) / 2),\n refy = down == 1 ? this.centerOfs : this.centerOfs + this.chart.centerHeight,\n ry = refy + down * r,\n diffXtop = Math.abs(d.group.slope * diffY),\n head = d.group.headLengthPx * Math.abs(ry - d.centerOfs) / r\n ;\n if (diffXtop > d.group.widthPx - d.group.tailLengthPx - head) {\n diffXtop = d.group.widthPx - d.group.tailLengthPx - head;\n }\n let right = d.group.leftSide ? -1 : 1,\n slope = Math.abs(diffXtop / diffY),\n x0 = this.connectorWidth,\n x1 = x0 + right * this.chart.centerWidth/2,\n x2 = x1 + right * head,\n x3 = x2 + right * diffXtop,\n x4 = x1 + right * d.group.widthPx,\n y1 = d.centerOfs,\n y2 = d.sideOfs,\n\n ta = (Math.atan(-down/slope) - Math.PI/2),\n\n c1y = down == 1 ?\n ((this.centerOfs + this.chart.centerHeight) * d.group.roundness + ry)/(d.group.roundness+1) :\n ((this.centerOfs * d.group.roundness) + ry) / (d.group.roundness+1),\n c1x = x1 + right * Math.abs(c1y-ry) / r * d.group.headLengthPx,\n\n r1 = Math.abs(c1y - y1),\n\n r2 = r1,\n\n c2x = x3 - (c1x - x2),\n c2y = y2 - down * r2\n ;\n\n const lw = 0;//.5;\n p.moveTo(x0, y1 );\n if (debug) {\n p.lineTo(x2, y1);\n // p.lineTo(x1, ry);\n // p.lineTo(x2, y1);\n p.lineTo(c1x, c1y);\n p.lineTo(x2, y1);\n p.lineTo(x1, y1 );\n }\n if (right == 1) {\n if (down == 1) {\n p.arc(c1x, c1y, r1, 3*Math.PI/2, -ta + Math.PI, false);\n p.arc(c2x, c2y, r2, -ta, Math.PI/2, true);\n } else {\n p.arc(c1x, c1y, r1, Math.PI/2, -ta, true);\n p.arc(c2x, c2y, r2, -ta - Math.PI, -Math.PI/2, false);\n }\n } else {\n if (down == 1) {\n p.arc(c1x, c1y, r1, -Math.PI/2, ta, true);\n p.arc(c2x, c2y, r2, ta + Math.PI, Math.PI/2, false);\n } else {\n p.arc(c1x, c1y, r1, Math.PI/2, ta + Math.PI, false);\n p.arc(c2x, c2y, r2, ta, -Math.PI/2, true);\n }\n }\n if (debug) {\n p.lineTo(x3, y2);\n p.lineTo(c2x, c2y);\n p.lineTo(x3, y2);\n }\n p.lineTo(x4, y2);\n return p.toString();\n }\n\n updateChart(chart?: MushonKeyChart) {\n\n if (chart) {\n this.chart = chart;\n }\n\n this.processData();\n\n let connectorsUpdate = this.d3Chart.select('g.connectors').selectAll<SVGElement, MushonKeyFlow>('.connector')\n .data(this.layout, (d: MushonKeyFlow) => d.label);\n let labelsUpdate = this.d3Chart.select('g.labels').selectAll<SVGElement, MushonKeyFlow>('.text')\n .data(this.layout, (d: MushonKeyFlow) => d.label);\n\n // remove exiting connectors\n connectorsUpdate.exit().remove();\n labelsUpdate.exit().remove();\n\n // add new bars\n connectorsUpdate.enter()\n .append('path')\n .attr('class', 'connector')\n .style('fill', 'none');\n\n labelsUpdate.enter()\n .append('text')\n .attr('class', 'text')\n .style('paint-order', 'stroke')\n .style('stroke-linejoin', 'round')\n .style('alignment-baseline', 'middle')\n .on('click', (event: Event, d: MushonKeyFlow) => { \n // console.log('MushonKey clicked', d.context);\n if (d.context) { this.onSelected.emit(d.context); } \n });\n\n connectorsUpdate = this.d3Chart.select('g.connectors').selectAll<SVGElement, MushonKeyFlow>('.connector')\n .data(this.layout, (d: MushonKeyFlow) => d.label);\n labelsUpdate = this.d3Chart.select('g.labels').selectAll<SVGElement, MushonKeyFlow>('.text')\n .data(this.layout, (d: MushonKeyFlow) => d.label);\n\n connectorsUpdate\n .attr('d', (d: any) => this.generatePath(d))\n .attr('class', (d: any) => 'connector ' + d.group.klass)\n .style('stroke-width', (d: any) => debug ? 1 : d.scaledSize+0.5)\n ;\n\n labelsUpdate\n .attr('y', (d: any) => d.sideOfs)\n .attr('x', (d: any) => d.group.leftSide ?\n this.connectorWidth - this.chart.centerWidth/2 - d.group.widthPx + this.textIndent :\n this.connectorWidth + this.chart.centerWidth/2 + d.group.widthPx - this.textIndent)\n .attr('class', (d: any) => 'text ' + d.group.klass)\n .style('cursor', (d: any) => d.context ? 'pointer' : 'inherit')\n .style('text-anchor', (d: any) => d.group.leftSide ? 'start' : 'end' )\n .style('fill', (d: any) => d.group.textColor )\n .style('font-size', (d: any) => d.group.labelTextSize)\n .style('stroke', (d: any) => d.scaledSize < d.group.labelTextSize ? 'white': 'none' )\n .style('stroke-width', (d: any) => d.group.labelTextSize/2)\n .text((d: MushonKeyFlow) => { return d.label; });\n\n this.drawCenter();\n }\n\n drawCenter() {\n let arrowOfs = this.chart.centerDirectionLeft ? -this.chart.centerHeight/3: this.chart.centerHeight/3;\n let centerPath = d3Path();\n centerPath.moveTo(this.connectorWidth - this.chart.centerWidth/2, this.centerOfs);\n centerPath.lineTo(this.connectorWidth + this.chart.centerWidth/2, this.centerOfs);\n centerPath.lineTo(this.connectorWidth + this.chart.centerWidth/2 + arrowOfs, this.centerOfs + this.chart.centerHeight/2);\n centerPath.lineTo(this.connectorWidth + this.chart.centerWidth/2, this.centerOfs + this.chart.centerHeight);\n centerPath.lineTo(this.connectorWidth - this.chart.centerWidth/2, this.centerOfs + this.chart.centerHeight);\n centerPath.lineTo(this.connectorWidth - this.chart.centerWidth/2 + arrowOfs, this.centerOfs + this.chart.centerHeight/2);\n centerPath.closePath();\n\n let center = this.d3Chart.select('g.centerpiece-container');\n\n this.d3Chart.select('g.centerpiece-container')\n .selectAll('path')\n .data([1])\n .enter()\n .append('path')\n .attr('class', 'centerpiece')\n ;\n this.d3Chart.select('g.centerpiece-container')\n .selectAll('path')\n .data([1])\n .attr('d', centerPath.toString())\n ;\n this.d3Chart.select('g.centerpiece-container')\n .selectAll('text')\n .data([1])\n .enter()\n .append('text')\n .attr('class', 'centerpiece-text')\n .style('alignment-baseline', 'middle')\n .style('text-anchor', 'middle')\n ;\n this.d3Chart.select('g.centerpiece-container')\n .selectAll('text')\n .data([1])\n .text(this.chart.centerText)\n .attr('x', this.connectorWidth + arrowOfs)\n .attr('y', this.centerOfs + this.chart.centerHeight/2)\n ;\n }\n}","import { NgModule } from '@angular/core';\nimport { MushonkeyComponent } from './mushonkey.component';\n\n\n\n@NgModule({\n declarations: [\n MushonkeyComponent\n ],\n imports: [\n ],\n exports: [\n MushonkeyComponent\n ]\n})\nexport class MushonkeyModule { }\n","/*\n * Public API Surface of mushonkey\n */\n\nexport * from './lib/mushonkey.component';\nexport * from './lib/mushonkey.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["d3Select","d3ScaleLinear","d3Max","d3Path"],"mappings":";;;;;;;AAUA,MAAM,KAAK,GAAG,KAAK;MAEN,aAAa,CAAA;AASxB,IAAA,WAAA,CAAY,IAAY,EACZ,KAAa,EACb,OAAY,EAAA;AAEtB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;;AAEzB;MAEY,kBAAkB,CAAA;AAe7B,IAAA,WAAA,CAAY,QAAiB,EACjB,KAA2B,EAC3B,KAAa,EACb,MAAe,EACf,KAAc,EACd,KAAc,EACd,SAAkB,EAClB,UAAmB,EACnB,UAAmB,EACnB,aAAsB,EAAA;AAGhC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,IAAI,EAAE;AACxC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,GAAG;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG;AACzB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI;AACpC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI;AAEpC,QAAA,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;;;AAGtB;MAEY,cAAc,CAAA;AASzB,IAAA,WAAA,CAAY,MAAiC,EACjC,UAAmB,EACnB,WAAoB,EACpB,YAAqB,EACrB,mBAA6B,EAC7B,MAAY,EACZ,oBAA6B,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,GAAG;AACvC,QAAA,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,GAAG;AACrC,QAAA,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,IAAI,IAAI,GAAG,IAAI,GAAG,mBAAmB;QACnF,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAC;AAClE,QAAA,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,IAAI,CAAC;;AAExD;MAaY,kBAAkB,CAAA;AAwB3B,IAAA,WAAA,CAAoB,EAAc,EAAA;QAAd,IAAE,CAAA,EAAA,GAAF,EAAE;AArBZ,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,YAAY,EAAO;QAEtC,IAAM,CAAA,MAAA,GAAyB,EAAE;QAKjC,IAAU,CAAA,UAAA,GAAW,EAAE;QAEvB,IAAa,CAAA,aAAA,GAAW,EAAE;QAC1B,IAAc,CAAA,cAAA,GAAW,EAAE;QAC3B,IAAgB,CAAA,gBAAA,GAAW,CAAC;;IAYpC,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE;YAC3B;;AAEF,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,IAAI,CAAC,WAAW,EAAE;;AAEpB,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,IAAI,CAAC,WAAW,EAAE;;;;IAKxB,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,EAAE;;IAGf,WAAW,GAAA;QACT,IAAI,CAAC,MAAM,EAAE;;IAGf,eAAe,GAAA;QACb,IAAI,CAAC,MAAM,EAAE;;IAGf,WAAW,GAAA;AACT,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;QACnF,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;QACrF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;QAEpC,MAAM,GAAG,GAAGA,MAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK;AACvC,aAAA,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW;AACjC,aAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC;;QAGvC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG;AAC1B,aAAA,IAAI,CAAC,OAAO,EAAE,WAAW;aACzB,IAAI,CAAC,WAAW,EAAE,CAAA,UAAA,EAAa,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAK,EAAA,EAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAG,CAAA,CAAA,CAAC;AACtF,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;AACpB,aAAA,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;AACpB,aAAA,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG;AACpB,aAAA,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;;IAG5B,WAAW,GAAA;AACP,QAAA,IAAI,OAAO,GAAG,CAAC,EACX,QAAQ,GAAG,CAAC,EACZ,SAAS,GAAG,CAAC,EACb,UAAU,GAAE,CAAC;AACjB,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAC9B,QAAA,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;YACxB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc;YACjD,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC;YAC3C,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;YACrD,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;AACrD,YAAA,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,gBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;oBAClB,SAAS,IAAI,CAAC;AACd,oBAAA,OAAO,IAAI,IAAI,CAAC,IAAI;;qBACf;oBACL,UAAU,IAAI,CAAC;AACf,oBAAA,QAAQ,IAAI,IAAI,CAAC,IAAI;;;;AAI3B,QAAA,IAAI,OAAO,IAAI,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC;;AAC/B,QAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;YAAE,QAAQ,GAAG,CAAC;;AACjC,QAAA,IAAI,SAAS,IAAI,CAAC,EAAE;YAAE,SAAS,GAAG,CAAC;;AACnC,QAAA,IAAI,UAAU,IAAI,CAAC,EAAE;YAAE,UAAU,GAAG,CAAC;;AAErC,QAAA,IAAI,CAAC,eAAe,GAAGC,WAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AACvI,QAAA,IAAI,CAAC,gBAAgB,GAAGA,WAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,IAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;AAE1I,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB;;aAC3C;YACL,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,IAAI,CAAC,SAAS,GAAWC,GAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;;iBAC5D;AACL,gBAAA,IAAI,CAAC,SAAS,GAAG,CAAC;;;AAGtB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS;AACxD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC;AAE1D,QAAA,IAAI,OAAO,GAAG;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,OAAO,EAAE;SACV;AAED,QAAA,IAAI,QAAQ,GAAG;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,OAAO,EAAE;SACV;AAED,QAAA,IAAI,CAAC,MAAM,GAAC,EAAE;AACd,QAAA,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;AACxB,YAAA,IAAI,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,OAAO,GAAG,QAAQ;YAC7C,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;AACxC,YAAA,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE;AAC5B,gBAAA,IAAI,WAAW;AACf,gBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;oBAClB,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;;qBACxC;oBACL,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;;AAEhD,gBAAA,IAAI,CAAC,UAAU,GAAG,WAAW;gBAC7B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,GAAG,WAAW,GAAC,CAAC;gBAC9C,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,WAAW,GAAC,CAAC;AAC1C,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtB,GAAG,CAAC,SAAS,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB;AACpD,gBAAA,GAAG,CAAC,OAAO,IAAYA,GAAK,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;;;;AAM7F,IAAA,YAAY,CAAC,CAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,GAACC,IAAM,EAAE;QACd,IAAI,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,SAAS,EAC/B,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACzB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EACnE,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAC5E,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,EACpB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,EAC1C,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;AAEhE,QAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,EAAE;AAC5D,YAAA,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI;;QAE1D,IAAI,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,EACjC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,EAClC,EAAE,GAAG,IAAI,CAAC,cAAc,EACxB,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,EAC1C,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,EACtB,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,QAAQ,EAC1B,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EACjC,EAAE,GAAG,CAAC,CAAC,SAAS,EAChB,EAAE,GAAG,CAAC,CAAC,OAAO,EAEd,EAAE,IAAK,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,GAAC,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,GAAC,CAAC,CAAC,EAE1C,GAAG,GAAG,IAAI,IAAI,CAAC;AACb,YAAA,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,KAAG,CAAC,CAAC,KAAK,CAAC,SAAS,GAAC,CAAC,CAAC;AAC3F,YAAA,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,GAAC,CAAC,CAAC,EACrE,GAAG,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,EAE9D,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,EAEvB,EAAE,GAAG,EAAE,EAEP,GAAG,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC,EACrB,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE;AAGxB,QAAA,MAAM,EAAE,GAAG,CAAC,CAAC;AACb,QAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAE;QACjB,IAAI,KAAK,EAAE;AACT,YAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;;;AAGhB,YAAA,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;AAClB,YAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AAChB,YAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAE;;AAEnB,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,IAAI,IAAI,IAAI,CAAC,EAAE;gBACb,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAC,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC;gBACtD,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,IAAI,CAAC;;iBACpC;gBACL,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC;gBACzC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,KAAK,CAAC;;;aAElD;AACL,YAAA,IAAI,IAAI,IAAI,CAAC,EAAE;gBACb,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;gBACzC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,KAAK,CAAC;;iBAC9C;gBACL,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC;gBACnD,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAC,CAAC,EAAE,IAAI,CAAC;;;QAG7C,IAAI,KAAK,EAAE;AACT,YAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AAChB,YAAA,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;AAClB,YAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;;AAElB,QAAA,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AAChB,QAAA,OAAO,CAAC,CAAC,QAAQ,EAAE;;AAGrB,IAAA,WAAW,CAAC,KAAsB,EAAA;QAEhC,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;;QAGpB,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,IAAI,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAA4B,YAAY;AACzG,aAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC;AACnD,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAA4B,OAAO;AAC5F,aAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC;;AAGnD,QAAA,gBAAgB,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;AAChC,QAAA,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE;;QAG5B,gBAAgB,CAAC,KAAK;aACnB,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,WAAW;AACzB,aAAA,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;QAExB,YAAY,CAAC,KAAK;aACf,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,MAAM;AACpB,aAAA,KAAK,CAAC,aAAa,EAAE,QAAQ;AAC7B,aAAA,KAAK,CAAC,iBAAiB,EAAE,OAAO;AAChC,aAAA,KAAK,CAAC,oBAAoB,EAAE,QAAQ;aACpC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,CAAgB,KAAI;;AAE9C,YAAA,IAAI,CAAC,CAAC,OAAO,EAAE;gBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;;AAClD,SAAC,CAAC;AAEJ,QAAA,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAA4B,YAAY;AACrG,aAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC;AACnD,QAAA,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAA4B,OAAO;AACxF,aAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAgB,KAAK,CAAC,CAAC,KAAK,CAAC;QAEnD;AACK,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAM,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AAC1C,aAAA,IAAI,CAAC,OAAO,EAAE,CAAC,CAAM,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK;aACtD,KAAK,CAAC,cAAc,EAAE,CAAC,CAAM,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,GAAC,GAAG,CAAC;QAGpE;aACG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,OAAO;AAC/B,aAAA,IAAI,CAAC,GAAG,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ;YACrC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU;YAClF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU;AACnF,aAAA,IAAI,CAAC,OAAO,EAAE,CAAC,CAAM,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK;AACjD,aAAA,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,GAAG,SAAS;aAC7D,KAAK,CAAC,aAAa,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,GAAG,KAAK;AACnE,aAAA,KAAK,CAAC,MAAM,EAAE,CAAC,CAAM,KAAM,CAAC,CAAC,KAAK,CAAC,SAAS;AAC5C,aAAA,KAAK,CAAC,WAAW,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa;aACpD,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,OAAO,GAAE,MAAM;AAClF,aAAA,KAAK,CAAC,cAAc,EAAE,CAAC,CAAM,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,GAAC,CAAC;AACzD,aAAA,IAAI,CAAC,CAAC,CAAgB,KAAO,EAAA,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAElD,IAAI,CAAC,UAAU,EAAE;;IAGnB,UAAU,GAAA;AACR,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,GAAC,CAAC,GAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAC,CAAC;AACrG,QAAA,IAAI,UAAU,GAAGA,IAAM,EAAE;AACzB,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;AACjF,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;AACjF,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAC,CAAC,CAAC;QACxH,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QAC3G,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AAC3G,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAC,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAC,CAAC,CAAC;QACxH,UAAU,CAAC,SAAS,EAAE;QAEtB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,yBAAyB,CAAC;AAE3D,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,yBAAyB;aAC1C,SAAS,CAAC,MAAM;AAChB,aAAA,IAAI,CAAC,CAAC,CAAC,CAAC;AACR,aAAA,KAAK;aACL,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;AAE/B,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,yBAAyB;aAC1C,SAAS,CAAC,MAAM;AAChB,aAAA,IAAI,CAAC,CAAC,CAAC,CAAC;aACR,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAEnC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,yBAAyB;aAC1C,SAAS,CAAC,MAAM;AAChB,aAAA,IAAI,CAAC,CAAC,CAAC,CAAC;AACR,aAAA,KAAK;aACL,MAAM,CAAC,MAAM;AACb,aAAA,IAAI,CAAC,OAAO,EAAE,kBAAkB;AAChC,aAAA,KAAK,CAAC,oBAAoB,EAAE,QAAQ;AACpC,aAAA,KAAK,CAAC,aAAa,EAAE,QAAQ,CAAC;AAEjC,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,yBAAyB;aAC1C,SAAS,CAAC,MAAM;AAChB,aAAA,IAAI,CAAC,CAAC,CAAC,CAAC;AACR,aAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;aAC1B,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,QAAQ;AACxC,aAAA,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAC,CAAC,CAAC;;8GAlUjD,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,8JATjB,CAAE,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA,CAAA,CAAA;;2FASH,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAX9B,SAAS;+BACI,WAAW,EAAA,QAAA,EACX,CAAE,CAAA,EAAA,UAAA,EAOA,KAAK,EAAA,MAAA,EAAA,CAAA,+CAAA,CAAA,EAAA;+EAID,KAAK,EAAA,CAAA;sBAApB,KAAK;uBAAC,OAAO;gBACJ,UAAU,EAAA,CAAA;sBAAnB;;;MCpGQ,eAAe,CAAA;8GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAf,eAAe,EAAA,YAAA,EAAA,CARxB,kBAAkB,CAAA,EAAA,OAAA,EAAA,CAKlB,kBAAkB,CAAA,EAAA,CAAA,CAAA;+GAGT,eAAe,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAV3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ;AACD,qBAAA;AACD,oBAAA,OAAO,EAAE,EACR;AACD,oBAAA,OAAO,EAAE;wBACP;AACD;AACF,iBAAA;;;ACdD;;AAEG;;ACFH;;AAEG;;;;"}