@kanaries/graphic-walker 0.3.16 → 0.4.1

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.
Files changed (87) hide show
  1. package/dist/App.d.ts +9 -2
  2. package/dist/assets/filter.worker-f09fcd6f.js.map +1 -1
  3. package/dist/assets/sort.worker-f77540ac.js.map +1 -0
  4. package/dist/assets/transform.worker-bae8e910.js.map +1 -0
  5. package/dist/assets/{viewQuery.worker-03404216.js.map → viewQuery.worker-bdb6477c.js.map} +1 -1
  6. package/dist/components/askViz/index.d.ts +6 -0
  7. package/dist/components/askViz/schemaTransform.d.ts +2 -0
  8. package/dist/components/dataTable/index.d.ts +9 -5
  9. package/dist/components/pivotTable/store.d.ts +0 -2
  10. package/dist/components/spinner.d.ts +2 -0
  11. package/dist/computation/clientComputation.d.ts +3 -0
  12. package/dist/computation/serverComputation.d.ts +8 -0
  13. package/dist/config.d.ts +3 -1
  14. package/dist/fields/filterField/tabs.d.ts +2 -1
  15. package/dist/graphic-walker.es.js +22268 -21682
  16. package/dist/graphic-walker.es.js.map +1 -1
  17. package/dist/graphic-walker.umd.js +139 -139
  18. package/dist/graphic-walker.umd.js.map +1 -1
  19. package/dist/hooks/index.d.ts +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/interfaces.d.ts +93 -4
  22. package/dist/lib/execExp.d.ts +4 -4
  23. package/dist/lib/interfaces.d.ts +1 -0
  24. package/dist/lib/viewQuery.d.ts +2 -2
  25. package/dist/renderer/hooks.d.ts +8 -4
  26. package/dist/renderer/index.d.ts +2 -1
  27. package/dist/renderer/pureRenderer.d.ts +17 -1
  28. package/dist/renderer/specRenderer.d.ts +1 -0
  29. package/dist/services.d.ts +8 -5
  30. package/dist/store/commonStore.d.ts +2 -2
  31. package/dist/store/visualSpecStore.d.ts +58 -42
  32. package/dist/utils/save.d.ts +10 -2
  33. package/dist/utils/workflow.d.ts +3 -0
  34. package/dist/vis/react-vega.d.ts +3 -1
  35. package/dist/workers/sort.d.ts +2 -2
  36. package/dist/workers/transform.d.ts +5 -2
  37. package/package.json +2 -2
  38. package/src/App.tsx +46 -7
  39. package/src/components/askViz/index.tsx +93 -0
  40. package/src/components/askViz/schemaTransform.ts +38 -0
  41. package/src/components/dataTable/index.tsx +53 -11
  42. package/src/components/limitSetting.tsx +8 -6
  43. package/src/components/pivotTable/index.tsx +0 -1
  44. package/src/components/pivotTable/store.tsx +0 -16
  45. package/src/components/sizeSetting.tsx +9 -7
  46. package/src/components/spinner.tsx +14 -0
  47. package/src/components/toggle.tsx +2 -2
  48. package/src/components/visualConfig/index.tsx +78 -8
  49. package/src/computation/clientComputation.ts +55 -0
  50. package/src/computation/serverComputation.ts +158 -0
  51. package/src/config.ts +15 -2
  52. package/src/dataSource/datasetConfig/index.tsx +38 -6
  53. package/src/dataSource/table.tsx +15 -2
  54. package/src/fields/filterField/filterEditDialog.tsx +11 -10
  55. package/src/fields/filterField/tabs.tsx +178 -77
  56. package/src/hooks/index.ts +8 -0
  57. package/src/index.tsx +2 -0
  58. package/src/interfaces.ts +108 -5
  59. package/src/lib/execExp.ts +20 -11
  60. package/src/lib/interfaces.ts +1 -0
  61. package/src/lib/op/aggregate.ts +1 -1
  62. package/src/lib/viewQuery.ts +2 -2
  63. package/src/locales/en-US.json +11 -2
  64. package/src/locales/ja-JP.json +11 -2
  65. package/src/locales/zh-CN.json +11 -2
  66. package/src/main.tsx +1 -1
  67. package/src/renderer/hooks.ts +57 -69
  68. package/src/renderer/index.tsx +10 -6
  69. package/src/renderer/pureRenderer.tsx +40 -14
  70. package/src/renderer/specRenderer.tsx +24 -7
  71. package/src/services.ts +7 -8
  72. package/src/store/commonStore.ts +7 -7
  73. package/src/store/visualSpecStore.ts +288 -192
  74. package/src/utils/save.ts +81 -3
  75. package/src/utils/workflow.ts +148 -0
  76. package/src/vis/react-vega.tsx +21 -6
  77. package/src/vis/spec/aggregate.ts +3 -2
  78. package/src/vis/spec/stack.ts +7 -6
  79. package/src/visualSettings/index.tsx +2 -4
  80. package/src/workers/filter.worker.js +1 -1
  81. package/src/workers/sort.ts +3 -4
  82. package/src/workers/sort.worker.ts +2 -2
  83. package/src/workers/transform.ts +7 -8
  84. package/src/workers/transform.worker.js +2 -2
  85. package/src/workers/viewQuery.worker.js +2 -2
  86. package/dist/assets/sort.worker-4299a6a0.js.map +0 -1
  87. package/dist/assets/transform.worker-a12fb3d8.js.map +0 -1
package/dist/App.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { IDarkMode, IMutField, IRow, IThemeKey, Specification } from './interfaces';
2
+ import { IComputationFunction, IDarkMode, IMutField, IRow, IThemeKey, Specification } from './interfaces';
3
3
  import { IGlobalStore } from './store';
4
4
  import type { ToolbarItemProps } from './components/toolbar';
5
5
  export interface IGWProps {
@@ -11,7 +11,7 @@ export interface IGWProps {
11
11
  i18nResources?: {
12
12
  [lang: string]: Record<string, string | any>;
13
13
  };
14
- keepAlive?: boolean;
14
+ keepAlive?: boolean | string;
15
15
  /**
16
16
  * auto parse field key into a safe string. default is true
17
17
  */
@@ -20,10 +20,17 @@ export interface IGWProps {
20
20
  themeKey?: IThemeKey;
21
21
  dark?: IDarkMode;
22
22
  storeRef?: React.MutableRefObject<IGlobalStore | null>;
23
+ computation?: IComputationFunction;
23
24
  toolbar?: {
24
25
  extra?: ToolbarItemProps[];
25
26
  exclude?: string[];
26
27
  };
28
+ enhanceAPI?: {
29
+ header?: Record<string, string>;
30
+ features?: {
31
+ askviz?: string | boolean;
32
+ };
33
+ };
27
34
  }
28
35
  declare const App: React.FunctionComponent<IGWProps>;
29
36
  export default App;
@@ -1 +1 @@
1
- {"version":3,"file":"filter.worker-f09fcd6f.js","sources":["../src/workers/filter.worker.js"],"sourcesContent":["/* eslint no-restricted-globals: 0 */\n/* eslint-disable */ \n\n/**\n * @param {import('../interfaces').IRow[]} dataSource\n * @param {import('../interfaces').IFilterField[]} filters\n * @return {import('../interfaces').IRow[]}\n */\nconst filter = (dataSource, filters) => {\n return dataSource.filter(which => {\n for (const { rule, fid } of filters) {\n if (!rule) {\n continue;\n }\n\n switch (rule.type) {\n case 'one of': {\n if (rule.value.has(which[fid])) {\n break;\n } else {\n return false;\n }\n }\n case 'range': {\n if (rule.value[0] <= which[fid] && which[fid] <= rule.value[1]) {\n break;\n } else {\n return false;\n }\n }\n case 'temporal range': {\n try {\n const time = new Date(which[fid]).getTime();\n\n if (\n rule.value[0] <= time && time <= rule.value[1]\n ) {\n break;\n } else {\n return false;\n }\n } catch (error) {\n console.error(error);\n\n return false;\n }\n }\n default: {\n console.warn('Unresolvable filter rule', rule);\n continue;\n }\n }\n }\n\n return true;\n });\n};\n\n/**\n * @param {MessageEvent<{ dataSource: import('../interfaces').IRow[]; filters: import('../interfaces').IFilterField[] }>} e\n */\nconst main = e => {\n const { dataSource, filters } = e.data;\n\n const filtered = filter(dataSource, filters);\n\n self.postMessage(filtered);\n};\n\nself.addEventListener('message', main, false);\n"],"names":["filter","dataSource","filters","which","rule","fid","time","error","main","e","filtered"],"mappings":"yBAQA,MAAMA,EAAS,CAACC,EAAYC,IACjBD,EAAW,OAAOE,GAAS,CAC9B,SAAW,CAAE,KAAAC,EAAM,IAAAC,CAAG,IAAMH,EACxB,GAAKE,EAIL,OAAQA,EAAK,KAAI,CACb,IAAK,SAAU,CACX,GAAIA,EAAK,MAAM,IAAID,EAAME,CAAG,CAAC,EACzB,MAEA,MAAO,EAEd,CACD,IAAK,QAAS,CACV,GAAID,EAAK,MAAM,CAAC,GAAKD,EAAME,CAAG,GAAKF,EAAME,CAAG,GAAKD,EAAK,MAAM,CAAC,EACzD,MAEA,MAAO,EAEd,CACD,IAAK,iBACD,GAAI,CACA,MAAME,EAAO,IAAI,KAAKH,EAAME,CAAG,CAAC,EAAE,UAElC,GACID,EAAK,MAAM,CAAC,GAAKE,GAAQA,GAAQF,EAAK,MAAM,CAAC,EAE7C,MAEA,MAAO,EAEd,OAAQG,EAAP,CACE,eAAQ,MAAMA,CAAK,EAEZ,EACV,CAEL,QAAS,CACL,QAAQ,KAAK,2BAA4BH,CAAI,EAC7C,QACH,CACJ,CAGL,MAAO,EACf,CAAK,EAMCI,EAAOC,GAAK,CACd,KAAM,CAAE,WAAAR,EAAY,QAAAC,GAAYO,EAAE,KAE5BC,EAAWV,EAAOC,EAAYC,CAAO,EAE3C,KAAK,YAAYQ,CAAQ,CAC7B,EAEA,KAAK,iBAAiB,UAAWF,EAAM,EAAK"}
1
+ {"version":3,"file":"filter.worker-f09fcd6f.js","sources":["../src/workers/filter.worker.js"],"sourcesContent":["/* eslint no-restricted-globals: 0 */\n/* eslint-disable */ \n\n/**\n * @param {import('../interfaces').IRow[]} dataSource\n * @param {import('../interfaces').IFilterFiledSimple[]} filters\n * @return {import('../interfaces').IRow[]}\n */\nconst filter = (dataSource, filters) => {\n return dataSource.filter(which => {\n for (const { rule, fid } of filters) {\n if (!rule) {\n continue;\n }\n\n switch (rule.type) {\n case 'one of': {\n if (rule.value.has(which[fid])) {\n break;\n } else {\n return false;\n }\n }\n case 'range': {\n if (rule.value[0] <= which[fid] && which[fid] <= rule.value[1]) {\n break;\n } else {\n return false;\n }\n }\n case 'temporal range': {\n try {\n const time = new Date(which[fid]).getTime();\n\n if (\n rule.value[0] <= time && time <= rule.value[1]\n ) {\n break;\n } else {\n return false;\n }\n } catch (error) {\n console.error(error);\n\n return false;\n }\n }\n default: {\n console.warn('Unresolvable filter rule', rule);\n continue;\n }\n }\n }\n\n return true;\n });\n};\n\n/**\n * @param {MessageEvent<{ dataSource: import('../interfaces').IRow[]; filters: import('../interfaces').IFilterField[] }>} e\n */\nconst main = e => {\n const { dataSource, filters } = e.data;\n\n const filtered = filter(dataSource, filters);\n\n self.postMessage(filtered);\n};\n\nself.addEventListener('message', main, false);\n"],"names":["filter","dataSource","filters","which","rule","fid","time","error","main","e","filtered"],"mappings":"yBAQA,MAAMA,EAAS,CAACC,EAAYC,IACjBD,EAAW,OAAOE,GAAS,CAC9B,SAAW,CAAE,KAAAC,EAAM,IAAAC,CAAG,IAAMH,EACxB,GAAKE,EAIL,OAAQA,EAAK,KAAI,CACb,IAAK,SAAU,CACX,GAAIA,EAAK,MAAM,IAAID,EAAME,CAAG,CAAC,EACzB,MAEA,MAAO,EAEd,CACD,IAAK,QAAS,CACV,GAAID,EAAK,MAAM,CAAC,GAAKD,EAAME,CAAG,GAAKF,EAAME,CAAG,GAAKD,EAAK,MAAM,CAAC,EACzD,MAEA,MAAO,EAEd,CACD,IAAK,iBACD,GAAI,CACA,MAAME,EAAO,IAAI,KAAKH,EAAME,CAAG,CAAC,EAAE,UAElC,GACID,EAAK,MAAM,CAAC,GAAKE,GAAQA,GAAQF,EAAK,MAAM,CAAC,EAE7C,MAEA,MAAO,EAEd,OAAQG,EAAP,CACE,eAAQ,MAAMA,CAAK,EAEZ,EACV,CAEL,QAAS,CACL,QAAQ,KAAK,2BAA4BH,CAAI,EAC7C,QACH,CACJ,CAGL,MAAO,EACf,CAAK,EAMCI,EAAOC,GAAK,CACd,KAAM,CAAE,WAAAR,EAAY,QAAAC,GAAYO,EAAE,KAE5BC,EAAWV,EAAOC,EAAYC,CAAO,EAE3C,KAAK,YAAYQ,CAAQ,CAC7B,EAEA,KAAK,iBAAiB,UAAWF,EAAM,EAAK"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort.worker-f77540ac.js","sources":["../src/workers/sort.ts","../src/workers/sort.worker.ts"],"sourcesContent":["import { IRow } from '../interfaces';\n\nfunction compareMulti(a: number[], b: number[]): number {\n if (a.length < b.length) return -compareMulti(b, a);\n for (let i = 0; i < a.length; i++) {\n if (!b[i]) return 1;\n const c = a[i] - b[i];\n if (c !== 0) return c;\n }\n return 0;\n}\n\nexport function sortBy(data: IRow[], viewMeasures: string[], sort: 'ascending' | 'descending') {\n const sortM = sort === 'ascending' ? 1 : -1;\n return data\n .map((x) => ({\n data: x,\n value: viewMeasures.map((f) => x[f]),\n }))\n .sort((a, b) => sortM * compareMulti(a.value, b.value))\n .map((x) => x.data);\n}","import { IRow } from '../interfaces';\nimport { sortBy } from './sort';\n\nconst main = (e: {\n data: {\n data: IRow[];\n viewMeasures: string[];\n sort: 'ascending' | 'descending';\n };\n}) => {\n try {\n const { data, viewMeasures, sort } = e.data;\n const ans = sortBy(data, viewMeasures, sort);\n self.postMessage(ans);\n } catch (err: any) {\n console.error(err.stack);\n self.postMessage(err.stack);\n }\n};\n\nself.addEventListener('message', main, false);\n"],"names":["compareMulti","a","b","i","c","sortBy","data","viewMeasures","sort","sortM","x","f","main","e","ans","err"],"mappings":"yBAEA,SAASA,EAAaC,EAAaC,EAAqB,CAChD,GAAAD,EAAE,OAASC,EAAE,OAAe,MAAA,CAACF,EAAaE,EAAGD,CAAC,EAClD,QAASE,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAAK,CAC3B,GAAA,CAACD,EAAEC,CAAC,EAAU,MAAA,GAClB,MAAMC,EAAIH,EAAEE,CAAC,EAAID,EAAEC,CAAC,EACpB,GAAIC,IAAM,EAAU,OAAAA,CACxB,CACO,MAAA,EACX,CAEgB,SAAAC,EAAOC,EAAcC,EAAwBC,EAAkC,CACrF,MAAAC,EAAQD,IAAS,YAAc,EAAI,GAClC,OAAAF,EACF,IAAKI,IAAO,CACT,KAAMA,EACN,MAAOH,EAAa,IAAKI,GAAMD,EAAEC,CAAC,CAAC,CAAA,EACrC,EACD,KAAK,CAACV,EAAGC,IAAMO,EAAQT,EAAaC,EAAE,MAAOC,EAAE,KAAK,CAAC,EACrD,IAAKQ,GAAMA,EAAE,IAAI,CAC1B,CClBA,MAAME,EAAQC,GAMR,CACE,GAAA,CACA,KAAM,CAAE,KAAAP,EAAM,aAAAC,EAAc,KAAAC,CAAA,EAASK,EAAE,KACjCC,EAAMT,EAAOC,EAAMC,EAAcC,CAAI,EAC3C,KAAK,YAAYM,CAAG,QACfC,GACG,QAAA,MAAMA,EAAI,KAAK,EAClB,KAAA,YAAYA,EAAI,KAAK,CAC9B,CACJ,EAEA,KAAK,iBAAiB,UAAWH,EAAM,EAAK"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.worker-bae8e910.js","sources":["../src/lib/execExp.ts","../src/workers/transform.ts","../src/workers/transform.worker.js"],"sourcesContent":["import { IExpParamter, IExpression, IField, IRow } from \"../interfaces\";\n\ninterface IDataFrame {\n [key: string]: any[];\n}\n\nexport function execExpression (exp: IExpression, dataFrame: IDataFrame): IDataFrame {\n const { op, params } = exp;\n const subFrame: IDataFrame = { ...dataFrame };\n const len = dataFrame[Object.keys(dataFrame)[0]].length;\n for (let param of params) {\n switch (param.type) {\n case 'field':\n subFrame[param.value] = dataFrame[param.value];\n break;\n case 'constant':\n subFrame[param.value] = new Array(len).fill(param.value);\n break;\n case 'expression':\n let f = execExpression(param.value, dataFrame);\n Object.keys(f).forEach(key => {\n subFrame[key] = f[key];\n })\n break;\n case 'value':\n default:\n break;\n }\n }\n switch (op) {\n case 'one':\n return one(exp.as, params, subFrame);\n case 'bin':\n return bin(exp.as, params, subFrame);\n case 'log2':\n return log2(exp.as, params, subFrame);\n case 'log10':\n return log10(exp.as, params, subFrame);\n case 'binCount':\n return binCount(exp.as, params, subFrame);\n default:\n return subFrame;\n }\n}\n\nfunction bin(resKey: string, params: IExpParamter[], data: IDataFrame, binSize: number | undefined = 10): IDataFrame {\n const { value: fieldKey } = params[0];\n const fieldValues = data[fieldKey] as number[];\n let _min = Infinity;\n let _max = -Infinity;\n for (let i = 0; i < fieldValues.length; i++) {\n let val = fieldValues[i];\n if (val > _max) _max = val;\n if (val < _min) _min = val;\n }\n const step = (_max - _min) / binSize;\n // prevent (_max - _min) to be 0\n const safeWidth = Math.min(Number.MAX_SAFE_INTEGER, Math.max(_max - _min, Number.MIN_VALUE));\n const beaStep = Math.max(-Math.round(Math.log10(safeWidth)) + 2, 0)\n // toFix() accepts 0-100\n const safeBeaStep = Math.min(100, Math.max(0, Math.max(Number.isFinite(beaStep) ? beaStep : 0, 0)));\n const newValues = fieldValues.map((v: number) => {\n let bIndex = Math.floor((v - _min) / step);\n if (bIndex === binSize) bIndex = binSize - 1;\n if (Number.isNaN(bIndex)) {\n bIndex = 0;\n }\n return Number(((bIndex * step + _min)).toFixed(safeBeaStep))\n });\n return {\n ...data,\n [resKey]: newValues,\n }\n}\n\nfunction binCount(resKey: string, params: IExpParamter[], data: IDataFrame, binSize: number | undefined = 10): IDataFrame {\n const { value: fieldKey } = params[0];\n const fieldValues = data[fieldKey] as number[];\n\n const valueWithIndices: {val: number; index: number; orderIndex: number }[] = fieldValues.map((v, i) => ({\n val: v,\n index: i\n })).sort((a, b) => a.val - b.val)\n .map((item, i) => ({\n val: item.val,\n index: item.index,\n orderIndex: i\n }))\n\n const groupSize = valueWithIndices.length / binSize;\n\n const newValues = valueWithIndices.sort((a, b) => a.index - b.index).map(item => {\n let bIndex = Math.floor(item.orderIndex / groupSize);\n if (bIndex === binSize) bIndex = binSize - 1;\n return bIndex + 1\n })\n return {\n ...data,\n [resKey]: newValues,\n }\n}\n\nfunction log2(resKey: string, params: IExpParamter[], data: IDataFrame): IDataFrame {\n const { value } = params[0];\n const field = data[value];\n const newField = field.map((v: number) => Math.log2(v));\n return {\n ...data,\n [resKey]: newField,\n }\n}\n\nfunction log10(resKey: string, params: IExpParamter[], data: IDataFrame): IDataFrame {\n const { value: fieldKey } = params[0];\n const fieldValues = data[fieldKey];\n const newField = fieldValues.map((v: number) => Math.log10(v));\n return {\n ...data,\n [resKey]: newField,\n }\n}\n\nfunction one(resKey: string, params: IExpParamter[], data: IDataFrame): IDataFrame {\n // const { value: fieldKey } = params[0];\n if (Object.keys(data).length === 0) return data;\n const len = data[Object.keys(data)[0]].length;\n const newField = new Array(len).fill(1);\n return {\n ...data,\n [resKey]: newField,\n }\n}\n\nexport function dataset2DataFrame(dataset: IRow[]): IDataFrame {\n const dataFrame: IDataFrame = {};\n if (dataset.length === 0) return dataFrame;\n Object.keys(dataset[0]).forEach((k) => {\n dataFrame[k] = dataset.map((row) => row[k]);\n });\n return dataFrame;\n}\n\nexport function dataframe2Dataset(dataFrame: IDataFrame): IRow[] {\n const cols = Object.keys(dataFrame);\n if (cols.length === 0) return [];\n const dataset: IRow[] = [];\n const len = dataFrame[Object.keys(dataFrame)[0]].length;\n for (let i = 0; i < len; i++) {\n const row: IRow = {};\n cols.forEach((k) => {\n row[k] = dataFrame[k][i];\n });\n dataset.push(row);\n }\n return dataset;\n}\n","import { ITransformWorkflowStep, IRow, IExpression } from \"../interfaces\";\nimport { dataframe2Dataset, dataset2DataFrame, execExpression } from \"../lib/execExp\";\n\nexport function transformData(data: IRow[], trans: { key: string, expression: IExpression }[]) {\n let df = dataset2DataFrame(data);\n for (let i = 0; i < trans.length; i++) {\n const field = trans[i];\n df = execExpression(field.expression, df);\n }\n return dataframe2Dataset(df);\n}\n","import { transformData } from './transform'\nconst main = e => {\n const { dataSource, trans } = e.data;\n\n try {\n const ans = transformData(dataSource, trans);\n self.postMessage(ans);\n } catch (error) {\n self.postMessage({ error: error.message });\n }\n};\n\nself.addEventListener('message', main, false);"],"names":["execExpression","exp","dataFrame","op","params","subFrame","len","param","f","key","one","bin","log2","log10","binCount","resKey","data","binSize","fieldKey","fieldValues","_min","_max","i","val","step","safeWidth","beaStep","safeBeaStep","newValues","v","bIndex","valueWithIndices","a","b","item","groupSize","value","newField","dataset2DataFrame","dataset","k","row","dataframe2Dataset","cols","transformData","trans","df","field","main","e","dataSource","ans","error"],"mappings":"yBAMgB,SAAAA,EAAgBC,EAAkBC,EAAmC,CAC3E,KAAA,CAAE,GAAAC,EAAI,OAAAC,CAAW,EAAAH,EACjBI,EAAuB,CAAE,GAAGH,GAC5BI,EAAMJ,EAAU,OAAO,KAAKA,CAAS,EAAE,CAAC,CAAC,EAAE,OACjD,QAASK,KAASH,EACd,OAAQG,EAAM,KAAM,CAChB,IAAK,QACDF,EAASE,EAAM,KAAK,EAAIL,EAAUK,EAAM,KAAK,EAC7C,MACJ,IAAK,WACQF,EAAAE,EAAM,KAAK,EAAI,IAAI,MAAMD,CAAG,EAAE,KAAKC,EAAM,KAAK,EACvD,MACJ,IAAK,aACD,IAAIC,EAAIR,EAAeO,EAAM,MAAOL,CAAS,EAC7C,OAAO,KAAKM,CAAC,EAAE,QAAeC,GAAA,CACjBJ,EAAAI,CAAG,EAAID,EAAEC,CAAG,CAAA,CACxB,EACD,KAIR,CAEJ,OAAQN,EAAI,CACR,IAAK,MACD,OAAOO,EAAIT,EAAI,GAAIG,EAAQC,CAAQ,EACvC,IAAK,MACD,OAAOM,EAAIV,EAAI,GAAIG,EAAQC,CAAQ,EACvC,IAAK,OACD,OAAOO,EAAKX,EAAI,GAAIG,EAAQC,CAAQ,EACxC,IAAK,QACD,OAAOQ,EAAMZ,EAAI,GAAIG,EAAQC,CAAQ,EACzC,IAAK,WACD,OAAOS,EAASb,EAAI,GAAIG,EAAQC,CAAQ,EAC5C,QACW,OAAAA,CACf,CACJ,CAEA,SAASM,EAAII,EAAgBX,EAAwBY,EAAkBC,EAA8B,GAAgB,CACjH,KAAM,CAAE,MAAOC,CAAS,EAAId,EAAO,CAAC,EAC9Be,EAAcH,EAAKE,CAAQ,EACjC,IAAIE,EAAO,IACPC,EAAO,KACX,QAASC,EAAI,EAAGA,EAAIH,EAAY,OAAQG,IAAK,CACrC,IAAAC,EAAMJ,EAAYG,CAAC,EACnBC,EAAMF,IAAaA,EAAAE,GACnBA,EAAMH,IAAaA,EAAAG,EAC3B,CACM,MAAAC,GAAQH,EAAOD,GAAQH,EAEvBQ,EAAY,KAAK,IAAI,OAAO,iBAAkB,KAAK,IAAIJ,EAAOD,EAAM,OAAO,SAAS,CAAC,EACrFM,EAAU,KAAK,IAAI,CAAC,KAAK,MAAM,KAAK,MAAMD,CAAS,CAAC,EAAI,EAAG,CAAC,EAE5DE,EAAc,KAAK,IAAI,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,OAAO,SAASD,CAAO,EAAIA,EAAU,EAAG,CAAC,CAAC,CAAC,EAC5FE,EAAYT,EAAY,IAAKU,GAAc,CAC7C,IAAIC,EAAS,KAAK,OAAOD,EAAIT,GAAQI,CAAI,EACzC,OAAIM,IAAWb,IAASa,EAASb,EAAU,GACvC,OAAO,MAAMa,CAAM,IACVA,EAAA,GAEN,QAASA,EAASN,EAAOJ,GAAO,QAAQO,CAAW,CAAC,CAAA,CAC9D,EACM,MAAA,CACH,GAAGX,EACH,CAACD,CAAM,EAAGa,CAAA,CAElB,CAEA,SAASd,EAASC,EAAgBX,EAAwBY,EAAkBC,EAA8B,GAAgB,CACtH,KAAM,CAAE,MAAOC,CAAS,EAAId,EAAO,CAAC,EAG9B2B,EAFcf,EAAKE,CAAQ,EAEyD,IAAI,CAACW,EAAGP,KAAO,CACrG,IAAKO,EACL,MAAOP,CACT,EAAA,EAAE,KAAK,CAACU,EAAGC,IAAMD,EAAE,IAAMC,EAAE,GAAG,EAC3B,IAAI,CAACC,EAAMZ,KAAO,CACf,IAAKY,EAAK,IACV,MAAOA,EAAK,MACZ,WAAYZ,CACd,EAAA,EAEAa,EAAYJ,EAAiB,OAASd,EAEtCW,EAAYG,EAAiB,KAAK,CAACC,EAAGC,IAAMD,EAAE,MAAQC,EAAE,KAAK,EAAE,IAAYC,GAAA,CAC7E,IAAIJ,EAAS,KAAK,MAAMI,EAAK,WAAaC,CAAS,EACnD,OAAIL,IAAWb,IAASa,EAASb,EAAU,GACpCa,EAAS,CAAA,CACnB,EACM,MAAA,CACH,GAAGd,EACH,CAACD,CAAM,EAAGa,CAAA,CAElB,CAEA,SAAShB,EAAKG,EAAgBX,EAAwBY,EAA8B,CAChF,KAAM,CAAE,MAAAoB,CAAA,EAAUhC,EAAO,CAAC,EAEpBiC,EADQrB,EAAKoB,CAAK,EACD,IAAKP,GAAc,KAAK,KAAKA,CAAC,CAAC,EAC/C,MAAA,CACH,GAAGb,EACH,CAACD,CAAM,EAAGsB,CAAA,CAElB,CAEA,SAASxB,EAAME,EAAgBX,EAAwBY,EAA8B,CACjF,KAAM,CAAE,MAAOE,CAAS,EAAId,EAAO,CAAC,EAE9BiC,EADcrB,EAAKE,CAAQ,EACJ,IAAKW,GAAc,KAAK,MAAMA,CAAC,CAAC,EACtD,MAAA,CACH,GAAGb,EACH,CAACD,CAAM,EAAGsB,CAAA,CAElB,CAEA,SAAS3B,EAAIK,EAAgBX,EAAwBY,EAA8B,CAE/E,GAAI,OAAO,KAAKA,CAAI,EAAE,SAAW,EAAU,OAAAA,EACrC,MAAAV,EAAMU,EAAK,OAAO,KAAKA,CAAI,EAAE,CAAC,CAAC,EAAE,OACjCqB,EAAW,IAAI,MAAM/B,CAAG,EAAE,KAAK,CAAC,EAC/B,MAAA,CACH,GAAGU,EACH,CAACD,CAAM,EAAGsB,CAAA,CAElB,CAEO,SAASC,EAAkBC,EAA6B,CAC3D,MAAMrC,EAAwB,CAAA,EAC9B,OAAIqC,EAAQ,SAAW,GACvB,OAAO,KAAKA,EAAQ,CAAC,CAAC,EAAE,QAASC,GAAM,CACzBtC,EAAAsC,CAAC,EAAID,EAAQ,IAAKE,GAAQA,EAAID,CAAC,CAAC,CAAA,CAC7C,EACMtC,CACX,CAEO,SAASwC,EAAkBxC,EAA+B,CACvD,MAAAyC,EAAO,OAAO,KAAKzC,CAAS,EAClC,GAAIyC,EAAK,SAAW,EAAG,MAAO,GAC9B,MAAMJ,EAAkB,CAAA,EAClBjC,EAAMJ,EAAU,OAAO,KAAKA,CAAS,EAAE,CAAC,CAAC,EAAE,OACjD,QAASoB,EAAI,EAAGA,EAAIhB,EAAKgB,IAAK,CAC1B,MAAMmB,EAAY,CAAA,EACbE,EAAA,QAASH,GAAM,CAChBC,EAAID,CAAC,EAAItC,EAAUsC,CAAC,EAAElB,CAAC,CAAA,CAC1B,EACDiB,EAAQ,KAAKE,CAAG,CACpB,CACO,OAAAF,CACX,CCxJgB,SAAAK,EAAc5B,EAAc6B,EAAmD,CACvF,IAAAC,EAAKR,EAAkBtB,CAAI,EAC/B,QAASM,EAAI,EAAGA,EAAIuB,EAAM,OAAQvB,IAAK,CAC7B,MAAAyB,EAAQF,EAAMvB,CAAC,EAChBwB,EAAA9C,EAAe+C,EAAM,WAAYD,CAAE,CAC5C,CACA,OAAOJ,EAAkBI,CAAE,CAC/B,CCTA,MAAME,EAAOC,GAAK,CACd,KAAM,CAAE,WAAAC,EAAY,MAAAL,GAAUI,EAAE,KAEhC,GAAI,CACA,MAAME,EAAMP,EAAcM,EAAYL,CAAK,EAC3C,KAAK,YAAYM,CAAG,CACvB,OAAQC,EAAP,CACE,KAAK,YAAY,CAAE,MAAOA,EAAM,OAAS,CAAA,CAC5C,CACL,EAEA,KAAK,iBAAiB,UAAWJ,EAAM,EAAK"}