@hailin-zheng/editor-core 1.0.14 → 1.0.20

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 (290) hide show
  1. package/lib/doc-ruler.d.ts +1 -0
  2. package/lib/doc-ruler.d.ts.map +1 -0
  3. package/lib/framework/common-util.d.ts +1 -0
  4. package/lib/framework/common-util.d.ts.map +1 -0
  5. package/lib/framework/document-change.d.ts +1 -0
  6. package/lib/framework/document-change.d.ts.map +1 -0
  7. package/lib/framework/document-combine.d.ts +1 -0
  8. package/lib/framework/document-combine.d.ts.map +1 -0
  9. package/lib/framework/document-comment.d.ts +1 -0
  10. package/lib/framework/document-comment.d.ts.map +1 -0
  11. package/lib/framework/document-context.d.ts +1 -0
  12. package/lib/framework/document-context.d.ts.map +1 -0
  13. package/lib/framework/document-eval-func.d.ts +1 -0
  14. package/lib/framework/document-eval-func.d.ts.map +1 -0
  15. package/lib/framework/document-event.d.ts +1 -0
  16. package/lib/framework/document-event.d.ts.map +1 -0
  17. package/lib/framework/document-history.d.ts +1 -0
  18. package/lib/framework/document-history.d.ts.map +1 -0
  19. package/lib/framework/document-images-loader.d.ts +1 -0
  20. package/lib/framework/document-images-loader.d.ts.map +1 -0
  21. package/lib/framework/document-input-cursor.d.ts +1 -0
  22. package/lib/framework/document-input-cursor.d.ts.map +1 -0
  23. package/lib/framework/document-paint.d.ts +1 -0
  24. package/lib/framework/document-paint.d.ts.map +1 -0
  25. package/lib/framework/document-print-offscreen.d.ts +1 -0
  26. package/lib/framework/document-print-offscreen.d.ts.map +1 -0
  27. package/lib/framework/document-print.d.ts +1 -0
  28. package/lib/framework/document-print.d.ts.map +1 -0
  29. package/lib/framework/document-segmenter.d.ts +1 -0
  30. package/lib/framework/document-segmenter.d.ts.map +1 -0
  31. package/lib/framework/document-selection.d.ts +1 -0
  32. package/lib/framework/document-selection.d.ts.map +1 -0
  33. package/lib/framework/document-template.d.ts +1 -0
  34. package/lib/framework/document-template.d.ts.map +1 -0
  35. package/lib/framework/document-textline-mode.d.ts +1 -0
  36. package/lib/framework/document-textline-mode.d.ts.map +1 -0
  37. package/lib/framework/element-define.d.ts +1 -0
  38. package/lib/framework/element-define.d.ts.map +1 -0
  39. package/lib/framework/element-event-define.d.ts +1 -0
  40. package/lib/framework/element-event-define.d.ts.map +1 -0
  41. package/lib/framework/element-measure.d.ts +1 -0
  42. package/lib/framework/element-measure.d.ts.map +1 -0
  43. package/lib/framework/element-paint.d.ts +1 -0
  44. package/lib/framework/element-paint.d.ts.map +1 -0
  45. package/lib/framework/element-props.d.ts +2 -1
  46. package/lib/framework/element-props.d.ts.map +1 -0
  47. package/lib/framework/element-reader.d.ts +1 -0
  48. package/lib/framework/element-reader.d.ts.map +1 -0
  49. package/lib/framework/element-render-cut.d.ts +1 -0
  50. package/lib/framework/element-render-cut.d.ts.map +1 -0
  51. package/lib/framework/element-serialize.d.ts +1 -0
  52. package/lib/framework/element-serialize.d.ts.map +1 -0
  53. package/lib/framework/element-util.d.ts +1 -0
  54. package/lib/framework/element-util.d.ts.map +1 -0
  55. package/lib/framework/impl/checkbox/checkbox-impl.d.ts +1 -0
  56. package/lib/framework/impl/checkbox/checkbox-impl.d.ts.map +1 -0
  57. package/lib/framework/impl/comments/comment-content-impl.d.ts +1 -0
  58. package/lib/framework/impl/comments/comment-content-impl.d.ts.map +1 -0
  59. package/lib/framework/impl/comments/comment-element-impl.d.ts +1 -0
  60. package/lib/framework/impl/comments/comment-element-impl.d.ts.map +1 -0
  61. package/lib/framework/impl/comments/comments-container-impl.d.ts +1 -0
  62. package/lib/framework/impl/comments/comments-container-impl.d.ts.map +1 -0
  63. package/lib/framework/impl/comments/comments-util.d.ts +1 -0
  64. package/lib/framework/impl/comments/comments-util.d.ts.map +1 -0
  65. package/lib/framework/impl/comments/validate-msg-impl.d.ts +1 -0
  66. package/lib/framework/impl/comments/validate-msg-impl.d.ts.map +1 -0
  67. package/lib/framework/impl/data-element/data-decorate-impl.d.ts +1 -0
  68. package/lib/framework/impl/data-element/data-decorate-impl.d.ts.map +1 -0
  69. package/lib/framework/impl/data-element/data-element-barcode.d.ts +1 -0
  70. package/lib/framework/impl/data-element/data-element-barcode.d.ts.map +1 -0
  71. package/lib/framework/impl/data-element/data-element-base-impl.d.ts +1 -0
  72. package/lib/framework/impl/data-element/data-element-base-impl.d.ts.map +1 -0
  73. package/lib/framework/impl/data-element/data-element-check-impl.d.ts +1 -0
  74. package/lib/framework/impl/data-element/data-element-check-impl.d.ts.map +1 -0
  75. package/lib/framework/impl/data-element/data-element-date-impl.d.ts +1 -0
  76. package/lib/framework/impl/data-element/data-element-date-impl.d.ts.map +1 -0
  77. package/lib/framework/impl/data-element/data-element-group-impl.d.ts +1 -0
  78. package/lib/framework/impl/data-element/data-element-group-impl.d.ts.map +1 -0
  79. package/lib/framework/impl/data-element/data-element-image-impl.d.ts +1 -0
  80. package/lib/framework/impl/data-element/data-element-image-impl.d.ts.map +1 -0
  81. package/lib/framework/impl/data-element/data-element-list-impl.d.ts +1 -0
  82. package/lib/framework/impl/data-element/data-element-list-impl.d.ts.map +1 -0
  83. package/lib/framework/impl/data-element/data-element-text-impl.d.ts +1 -0
  84. package/lib/framework/impl/data-element/data-element-text-impl.d.ts.map +1 -0
  85. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts +1 -0
  86. package/lib/framework/impl/decorate/fill-null-space-imple.d.ts.map +1 -0
  87. package/lib/framework/impl/document/doc-body-impl.d.ts +1 -0
  88. package/lib/framework/impl/document/doc-body-impl.d.ts.map +1 -0
  89. package/lib/framework/impl/document/doc-body-part-impl.d.ts +1 -0
  90. package/lib/framework/impl/document/doc-body-part-impl.d.ts.map +1 -0
  91. package/lib/framework/impl/document/doc-container-impl.d.ts +1 -0
  92. package/lib/framework/impl/document/doc-container-impl.d.ts.map +1 -0
  93. package/lib/framework/impl/document/doc-footer-impl.d.ts +1 -0
  94. package/lib/framework/impl/document/doc-footer-impl.d.ts.map +1 -0
  95. package/lib/framework/impl/document/doc-header-impl.d.ts +1 -0
  96. package/lib/framework/impl/document/doc-header-impl.d.ts.map +1 -0
  97. package/lib/framework/impl/document/doc-impl.d.ts +1 -0
  98. package/lib/framework/impl/document/doc-impl.d.ts.map +1 -0
  99. package/lib/framework/impl/index.d.ts +37 -0
  100. package/lib/framework/impl/index.d.ts.map +1 -0
  101. package/lib/framework/impl/media-formula/menstrual-history.d.ts +1 -0
  102. package/lib/framework/impl/media-formula/menstrual-history.d.ts.map +1 -0
  103. package/lib/framework/impl/paragraph/p-impl.d.ts +1 -0
  104. package/lib/framework/impl/paragraph/p-impl.d.ts.map +1 -0
  105. package/lib/framework/impl/picture/image-impl.d.ts +1 -0
  106. package/lib/framework/impl/picture/image-impl.d.ts.map +1 -0
  107. package/lib/framework/impl/radio/radio-impl.d.ts +1 -0
  108. package/lib/framework/impl/radio/radio-impl.d.ts.map +1 -0
  109. package/lib/framework/impl/symbol/br-symbol-impl.d.ts +1 -0
  110. package/lib/framework/impl/symbol/br-symbol-impl.d.ts.map +1 -0
  111. package/lib/framework/impl/symbol/p-symbol-impl.d.ts +1 -0
  112. package/lib/framework/impl/symbol/p-symbol-impl.d.ts.map +1 -0
  113. package/lib/framework/impl/table/table-cell-impl.d.ts +1 -0
  114. package/lib/framework/impl/table/table-cell-impl.d.ts.map +1 -0
  115. package/lib/framework/impl/table/table-impl.d.ts +1 -0
  116. package/lib/framework/impl/table/table-impl.d.ts.map +1 -0
  117. package/lib/framework/impl/table/table-row-impl.d.ts +1 -0
  118. package/lib/framework/impl/table/table-row-impl.d.ts.map +1 -0
  119. package/lib/framework/impl/table/table-split-cell-patch.d.ts +1 -0
  120. package/lib/framework/impl/table/table-split-cell-patch.d.ts.map +1 -0
  121. package/lib/framework/impl/table/table-split-cell.d.ts +1 -0
  122. package/lib/framework/impl/table/table-split-cell.d.ts.map +1 -0
  123. package/lib/framework/impl/table/table-util.d.ts +1 -0
  124. package/lib/framework/impl/table/table-util.d.ts.map +1 -0
  125. package/lib/framework/impl/text/text-impl.d.ts +1 -0
  126. package/lib/framework/impl/text/text-impl.d.ts.map +1 -0
  127. package/lib/framework/impl/text/track-run-impl.d.ts +1 -0
  128. package/lib/framework/impl/text/track-run-impl.d.ts.map +1 -0
  129. package/lib/framework/notify.d.ts +1 -0
  130. package/lib/framework/notify.d.ts.map +1 -0
  131. package/lib/framework/range-util.d.ts +1 -0
  132. package/lib/framework/range-util.d.ts.map +1 -0
  133. package/lib/framework/render-context.d.ts +1 -0
  134. package/lib/framework/render-context.d.ts.map +1 -0
  135. package/lib/framework/render-define.d.ts +1 -0
  136. package/lib/framework/render-define.d.ts.map +1 -0
  137. package/lib/framework/selection-overlays.d.ts +1 -0
  138. package/lib/framework/selection-overlays.d.ts.map +1 -0
  139. package/lib/index.d.ts +35 -0
  140. package/lib/index.d.ts.map +1 -0
  141. package/lib/index.js +15671 -0
  142. package/lib/texteditor.d.ts +3 -2
  143. package/lib/texteditor.d.ts.map +1 -0
  144. package/lib/util/subject.d.ts +1 -0
  145. package/lib/util/subject.d.ts.map +1 -0
  146. package/lib/util/table-bind.d.ts +1 -0
  147. package/lib/util/table-bind.d.ts.map +1 -0
  148. package/package.json +14 -8
  149. package/lib/doc-ruler.js +0 -313
  150. package/lib/doc-ruler.js.map +0 -1
  151. package/lib/framework/common-util.js +0 -178
  152. package/lib/framework/common-util.js.map +0 -1
  153. package/lib/framework/document-change.js +0 -1342
  154. package/lib/framework/document-change.js.map +0 -1
  155. package/lib/framework/document-combine.js +0 -40
  156. package/lib/framework/document-combine.js.map +0 -1
  157. package/lib/framework/document-comment.js +0 -148
  158. package/lib/framework/document-comment.js.map +0 -1
  159. package/lib/framework/document-context.js +0 -330
  160. package/lib/framework/document-context.js.map +0 -1
  161. package/lib/framework/document-eval-func.js +0 -48
  162. package/lib/framework/document-eval-func.js.map +0 -1
  163. package/lib/framework/document-event.js +0 -1054
  164. package/lib/framework/document-event.js.map +0 -1
  165. package/lib/framework/document-history.js +0 -65
  166. package/lib/framework/document-history.js.map +0 -1
  167. package/lib/framework/document-images-loader.js +0 -66
  168. package/lib/framework/document-images-loader.js.map +0 -1
  169. package/lib/framework/document-input-cursor.js +0 -239
  170. package/lib/framework/document-input-cursor.js.map +0 -1
  171. package/lib/framework/document-paint.js +0 -103
  172. package/lib/framework/document-paint.js.map +0 -1
  173. package/lib/framework/document-print-offscreen.js +0 -128
  174. package/lib/framework/document-print-offscreen.js.map +0 -1
  175. package/lib/framework/document-print.js +0 -203
  176. package/lib/framework/document-print.js.map +0 -1
  177. package/lib/framework/document-segmenter.js +0 -106
  178. package/lib/framework/document-segmenter.js.map +0 -1
  179. package/lib/framework/document-selection.js +0 -358
  180. package/lib/framework/document-selection.js.map +0 -1
  181. package/lib/framework/document-template.js +0 -20
  182. package/lib/framework/document-template.js.map +0 -1
  183. package/lib/framework/document-textline-mode.js +0 -30
  184. package/lib/framework/document-textline-mode.js.map +0 -1
  185. package/lib/framework/element-define.js +0 -579
  186. package/lib/framework/element-define.js.map +0 -1
  187. package/lib/framework/element-event-define.js +0 -108
  188. package/lib/framework/element-event-define.js.map +0 -1
  189. package/lib/framework/element-measure.js +0 -551
  190. package/lib/framework/element-measure.js.map +0 -1
  191. package/lib/framework/element-paint.js +0 -170
  192. package/lib/framework/element-paint.js.map +0 -1
  193. package/lib/framework/element-props.js +0 -809
  194. package/lib/framework/element-props.js.map +0 -1
  195. package/lib/framework/element-reader.js +0 -151
  196. package/lib/framework/element-reader.js.map +0 -1
  197. package/lib/framework/element-render-cut.js +0 -449
  198. package/lib/framework/element-render-cut.js.map +0 -1
  199. package/lib/framework/element-serialize.js +0 -113
  200. package/lib/framework/element-serialize.js.map +0 -1
  201. package/lib/framework/element-util.js +0 -1463
  202. package/lib/framework/element-util.js.map +0 -1
  203. package/lib/framework/impl/checkbox/checkbox-impl.js +0 -64
  204. package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  205. package/lib/framework/impl/comments/comment-content-impl.js +0 -105
  206. package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
  207. package/lib/framework/impl/comments/comment-element-impl.js +0 -62
  208. package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
  209. package/lib/framework/impl/comments/comments-container-impl.js +0 -62
  210. package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
  211. package/lib/framework/impl/comments/comments-util.js +0 -67
  212. package/lib/framework/impl/comments/comments-util.js.map +0 -1
  213. package/lib/framework/impl/comments/validate-msg-impl.js +0 -83
  214. package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
  215. package/lib/framework/impl/data-element/data-decorate-impl.js +0 -91
  216. package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  217. package/lib/framework/impl/data-element/data-element-barcode.js +0 -115
  218. package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
  219. package/lib/framework/impl/data-element/data-element-base-impl.js +0 -205
  220. package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  221. package/lib/framework/impl/data-element/data-element-check-impl.js +0 -133
  222. package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  223. package/lib/framework/impl/data-element/data-element-date-impl.js +0 -111
  224. package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  225. package/lib/framework/impl/data-element/data-element-group-impl.js +0 -130
  226. package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  227. package/lib/framework/impl/data-element/data-element-image-impl.js +0 -137
  228. package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  229. package/lib/framework/impl/data-element/data-element-list-impl.js +0 -131
  230. package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  231. package/lib/framework/impl/data-element/data-element-text-impl.js +0 -103
  232. package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  233. package/lib/framework/impl/decorate/fill-null-space-imple.js +0 -43
  234. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  235. package/lib/framework/impl/document/doc-body-impl.js +0 -79
  236. package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
  237. package/lib/framework/impl/document/doc-body-part-impl.js +0 -94
  238. package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
  239. package/lib/framework/impl/document/doc-container-impl.js +0 -21
  240. package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
  241. package/lib/framework/impl/document/doc-footer-impl.js +0 -77
  242. package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
  243. package/lib/framework/impl/document/doc-header-impl.js +0 -83
  244. package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
  245. package/lib/framework/impl/document/doc-impl.js +0 -209
  246. package/lib/framework/impl/document/doc-impl.js.map +0 -1
  247. package/lib/framework/impl/media-formula/menstrual-history.js +0 -153
  248. package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
  249. package/lib/framework/impl/paragraph/p-impl.js +0 -156
  250. package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
  251. package/lib/framework/impl/picture/image-impl.js +0 -124
  252. package/lib/framework/impl/picture/image-impl.js.map +0 -1
  253. package/lib/framework/impl/radio/radio-impl.js +0 -72
  254. package/lib/framework/impl/radio/radio-impl.js.map +0 -1
  255. package/lib/framework/impl/symbol/br-symbol-impl.js +0 -54
  256. package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  257. package/lib/framework/impl/symbol/p-symbol-impl.js +0 -54
  258. package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  259. package/lib/framework/impl/table/table-cell-impl.js +0 -145
  260. package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
  261. package/lib/framework/impl/table/table-impl.js +0 -363
  262. package/lib/framework/impl/table/table-impl.js.map +0 -1
  263. package/lib/framework/impl/table/table-row-impl.js +0 -75
  264. package/lib/framework/impl/table/table-row-impl.js.map +0 -1
  265. package/lib/framework/impl/table/table-split-cell-patch.js +0 -89
  266. package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
  267. package/lib/framework/impl/table/table-split-cell.js +0 -464
  268. package/lib/framework/impl/table/table-split-cell.js.map +0 -1
  269. package/lib/framework/impl/table/table-util.js +0 -678
  270. package/lib/framework/impl/table/table-util.js.map +0 -1
  271. package/lib/framework/impl/text/text-impl.js +0 -149
  272. package/lib/framework/impl/text/text-impl.js.map +0 -1
  273. package/lib/framework/impl/text/track-run-impl.js +0 -112
  274. package/lib/framework/impl/text/track-run-impl.js.map +0 -1
  275. package/lib/framework/notify.js +0 -116
  276. package/lib/framework/notify.js.map +0 -1
  277. package/lib/framework/range-util.js +0 -312
  278. package/lib/framework/range-util.js.map +0 -1
  279. package/lib/framework/render-context.js +0 -384
  280. package/lib/framework/render-context.js.map +0 -1
  281. package/lib/framework/render-define.js +0 -195
  282. package/lib/framework/render-define.js.map +0 -1
  283. package/lib/framework/selection-overlays.js +0 -124
  284. package/lib/framework/selection-overlays.js.map +0 -1
  285. package/lib/texteditor.js +0 -913
  286. package/lib/texteditor.js.map +0 -1
  287. package/lib/util/subject.js +0 -88
  288. package/lib/util/subject.js.map +0 -1
  289. package/lib/util/table-bind.js +0 -6
  290. package/lib/util/table-bind.js.map +0 -1
@@ -1,678 +0,0 @@
1
- import { ElementUtil } from "../../element-util";
2
- import { ParagraphElement } from "../paragraph/p-impl";
3
- import { TableCellElement } from "./table-cell-impl";
4
- import { TableElement } from "./table-impl";
5
- import { TableRowElement } from "./table-row-impl";
6
- export class TableUtil {
7
- static canDeleteTable(ss) {
8
- const { startControl } = ss;
9
- if (!startControl) {
10
- return false;
11
- }
12
- const tb = ElementUtil.getParentByType(startControl, TableElement);
13
- return !!tb;
14
- }
15
- /**
16
- * 校验当前选区是否可以执行合并单元格操作
17
- * @param ss
18
- * @returns
19
- */
20
- static canMergeCells(ss) {
21
- const { ancestorCommonControl, startControl, endControl, collapsed, selectedRange } = ss;
22
- if (collapsed) {
23
- return false;
24
- }
25
- if (ancestorCommonControl instanceof TableElement || ancestorCommonControl instanceof TableRowElement) {
26
- const tbElement = ancestorCommonControl instanceof TableElement ? ancestorCommonControl : ancestorCommonControl.parent;
27
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
28
- const endCell = ElementUtil.getParentByType(endControl, TableCellElement);
29
- if (startCell?.parent?.parent === tbElement && endCell?.parent?.parent === tbElement) {
30
- const tbRegion = this.getTableRectSelectedRegion(tbElement, startCell, endCell);
31
- if (selectedRange && selectedRange.target === tbElement) {
32
- const selectedCells = [];
33
- selectedRange.selectedChildren.every(item => item.selectedChildren.every(cell => selectedCells.push(cell.target)));
34
- for (let i = tbRegion.startRow; i <= tbRegion.endRow; i++) {
35
- const currRow = tbElement.getChild(i);
36
- for (let j = tbRegion.startCol; j <= tbRegion.endCol; j++) {
37
- const currCell = currRow.getChild(j);
38
- if (currCell.isNotBeMergedCell() && selectedCells.indexOf(currCell) < 0) {
39
- return false;
40
- }
41
- }
42
- }
43
- return true;
44
- }
45
- }
46
- }
47
- return false;
48
- }
49
- /**
50
- * 获取横向合并当前单元格合并结束索引位置
51
- * @param tb
52
- * @param rowIndex
53
- * @param colIndex
54
- */
55
- static getHMergeEndIndex(tb, rowIndex, colIndex) {
56
- const currRow = tb.getChild(rowIndex);
57
- let index = colIndex;
58
- for (let i = colIndex + 1; i < tb.getColsCount(); i++) {
59
- const cell = currRow.getChild(i);
60
- if (cell.props.hMerge === 'continue') {
61
- index = i;
62
- }
63
- else {
64
- break;
65
- }
66
- }
67
- return index;
68
- }
69
- /**
70
- * 获取横向合并当前单元格合并开始索引位置
71
- * @param tb
72
- * @param rowIndex
73
- * @param colIndex
74
- */
75
- static getHMergeStartIndex(tb, rowIndex, colIndex) {
76
- const row = tb.getChild(rowIndex);
77
- for (let i = colIndex - 1; i >= 0; i--) {
78
- const cell = row.getChild(i);
79
- if (cell.props.hMerge === 'restart') {
80
- return i;
81
- }
82
- }
83
- throw new Error('未找到主合并单元格');
84
- }
85
- /**
86
- * 获取纵向合并当前单元格合并结束索引位置
87
- * @param tb
88
- * @param rowIndex
89
- * @param colIndex i
90
- */
91
- static getVMergeEndIndex(tb, rowIndex, colIndex) {
92
- let index = rowIndex;
93
- for (let i = rowIndex + 1; i < tb.length; i++) {
94
- const currRow = tb.getChild(i);
95
- const cell = currRow.getChild(colIndex);
96
- if (cell.props.vMerge === 'continue') {
97
- index = i;
98
- }
99
- else {
100
- break;
101
- }
102
- }
103
- return index;
104
- }
105
- /**
106
- * 获取纵向合并当前单元格合并开始索引位置
107
- * @param tb
108
- * @param rowIndex
109
- * @param colIndex i
110
- */
111
- static getVMergeStartIndex(tb, rowIndex, colIndex) {
112
- for (let i = rowIndex - 1; i >= 0; i--) {
113
- const currRow = tb.getChild(i);
114
- const cell = currRow.getChild(colIndex);
115
- if (cell.props.vMerge === 'restart') {
116
- return i;
117
- }
118
- }
119
- throw new Error('未找到主合并单元格');
120
- }
121
- /**
122
- * 合并单元格
123
- * @param ss
124
- * @returns
125
- */
126
- static mergeCells(ss) {
127
- const { ancestorCommonControl, startControl, endControl, collapsed } = ss;
128
- if (collapsed) {
129
- return;
130
- }
131
- if (ancestorCommonControl instanceof TableElement || ancestorCommonControl instanceof TableRowElement) {
132
- const tbElement = ancestorCommonControl instanceof TableElement ? ancestorCommonControl : ancestorCommonControl.parent;
133
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
134
- const endCell = ElementUtil.getParentByType(endControl, TableCellElement);
135
- if (startCell?.parent?.parent === tbElement && endCell?.parent?.parent === tbElement) {
136
- //this.combineCellContent(tbElement, startCell, endCell);
137
- this.combineCells(tbElement, startCell, endCell);
138
- }
139
- this.checkRowBeMerged(ss);
140
- ss.clear();
141
- }
142
- }
143
- /**
144
- * 在合并单元格后需要校验
145
- * 1.如果某个行的所有单元格都不是normal,则需要删除当前行
146
- * 2.如果某个列的所有的单元格都不是normal,则需要删除当前列
147
- */
148
- static checkRowBeMerged(ss) {
149
- const tb = ElementUtil.getParentByType(ss.startControl, TableElement);
150
- if (!tb) {
151
- return;
152
- }
153
- const colsCount = tb.getColsCount();
154
- const fullMergeRows = [];
155
- for (let i = 0; i < tb.length; i++) {
156
- const row = tb.getChild(i);
157
- let count = 0;
158
- for (let j = 0; j < colsCount; j++) {
159
- const cell = row.getChild(j);
160
- if (!cell.isNotBeMergedCell()) {
161
- count++;
162
- }
163
- }
164
- //当前行所有的单元格都被合并,需要删除
165
- if (count === colsCount) {
166
- fullMergeRows.push(row);
167
- }
168
- }
169
- fullMergeRows.forEach(row => this.removeRow(row));
170
- }
171
- /**
172
- * 移除行
173
- * @param row
174
- */
175
- static removeRow(row) {
176
- const rowIndex = row.getIndex();
177
- const tb = row.parent;
178
- for (let i = 0; i < row.length; i++) {
179
- const cell = row.getChild(i);
180
- if (cell.props.vMerge === 'restart') {
181
- const vMergeEndIndex = this.getVMergeEndIndex(tb, rowIndex, i);
182
- if (vMergeEndIndex > rowIndex) {
183
- const nextRow = tb.getChild(rowIndex + 1);
184
- nextRow.getChild(i).props.vMerge = vMergeEndIndex - rowIndex > 2 ? 'restart' : null;
185
- }
186
- }
187
- else if (cell.props.vMerge === 'continue') {
188
- // const vMergeEndIndex = this.getVMergeEndIndex(tb, rowIndex, i);
189
- // if (vMergeEndIndex > rowIndex) {
190
- // const nextRow = tb.getChild<TableRowElement>(rowIndex + 1);
191
- // nextRow.getChild<TableCellElement>(i).cellProps.vMerge = 'continue';
192
- // }
193
- const vMergeStartIndex = this.getVMergeStartIndex(tb, rowIndex, i);
194
- const vMergeEndIndex = this.getVMergeEndIndex(tb, rowIndex, i);
195
- //当前单元格处于合并行的最后一行,并且合并的行数为2行
196
- if (vMergeEndIndex === rowIndex && vMergeEndIndex - vMergeStartIndex === 1) {
197
- const aboveCell = tb.getChild(vMergeStartIndex).getChild(i);
198
- aboveCell.props.vMerge = null;
199
- }
200
- }
201
- }
202
- tb.removeChild(row);
203
- }
204
- /**
205
- * 移除列
206
- * @param tb
207
- * @param colIndex
208
- */
209
- static removeCol(tb, colIndex) {
210
- for (let i = 0; i < tb.length; i++) {
211
- const row = tb.getChild(i);
212
- const cell = row.getChild(colIndex);
213
- if (cell.props.hMerge === 'restart') {
214
- const hMergeEndIndex = this.getHMergeEndIndex(tb, i, colIndex);
215
- if (hMergeEndIndex > colIndex) {
216
- const nextCell = row.getChild(colIndex + 1);
217
- nextCell.props.hMerge = hMergeEndIndex - colIndex > 2 ? 'restart' : null;
218
- }
219
- }
220
- else if (cell.props.hMerge === 'continue') {
221
- const hMergeStartIndex = this.getHMergeStartIndex(tb, i, colIndex);
222
- const hMergeEndIndex = this.getHMergeEndIndex(tb, i, colIndex);
223
- //当前单元格处于合并行的最后一行,并且合并的行数为2行
224
- if (hMergeEndIndex === colIndex && hMergeEndIndex - hMergeStartIndex === 1) {
225
- const masterVMergeCell = tb.getChild(hMergeStartIndex).getChild(i);
226
- masterVMergeCell.props.hMerge = null;
227
- }
228
- }
229
- row.removeChild(cell);
230
- }
231
- tb.removeCol(colIndex);
232
- }
233
- /**
234
- * 移除光标所在的当前行
235
- * @param ss
236
- */
237
- static removeCurrRow(ss) {
238
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
239
- if (!startCell?.parent) {
240
- throw new Error('parent is null');
241
- }
242
- const currRow = startCell.parent;
243
- const tb = currRow.parent;
244
- this.removeRow(currRow);
245
- tb.pubOnChange('self');
246
- tb.refreshView();
247
- }
248
- /**
249
- * 移除光标所在的当前列
250
- * @param ss
251
- */
252
- static removeCurrCol(ss) {
253
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
254
- if (!startCell?.parent) {
255
- throw new Error('parent is null');
256
- }
257
- if (ss.collapsed) {
258
- const currRow = startCell.parent;
259
- const tb = currRow.parent;
260
- this.removeCol(tb, startCell.getIndex());
261
- ss.clear();
262
- return;
263
- }
264
- const { ancestorCommonControl, startControl, endControl } = ss;
265
- if (ancestorCommonControl instanceof TableElement || ancestorCommonControl instanceof TableRowElement) {
266
- const tbElement = ancestorCommonControl instanceof TableElement ? ancestorCommonControl : ancestorCommonControl.parent;
267
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
268
- const endCell = ElementUtil.getParentByType(endControl, TableCellElement);
269
- if (startCell?.parent?.parent === tbElement && endCell?.parent?.parent === tbElement) {
270
- const startColIndex = startCell.getIndex();
271
- let endColIndex = endCell.getIndex();
272
- while (startColIndex <= endColIndex) {
273
- this.removeCol(tbElement, endColIndex);
274
- endColIndex--;
275
- }
276
- }
277
- tbElement.pubOnChange('self');
278
- }
279
- ss.clear();
280
- }
281
- /**
282
- * 合并单元格
283
- */
284
- static combineCells(tbElement, startCell, endCell) {
285
- const tbRegion = this.getTableRectSelectedRegion(tbElement, startCell, endCell);
286
- const cellContents = [];
287
- for (let i = tbRegion.startRow; i <= tbRegion.endRow; i++) {
288
- const currRow = tbElement.getChild(i);
289
- for (let j = tbRegion.startCol; j <= tbRegion.endCol; j++) {
290
- const currCell = currRow.getChild(j);
291
- currCell.props.vMerge = null;
292
- currCell.props.hMerge = 'continue';
293
- if (j === tbRegion.startCol) {
294
- currCell.props.vMerge = i === tbRegion.startRow ? 'restart' : 'continue';
295
- currCell.props.hMerge = 'restart';
296
- }
297
- if (currCell !== startCell) {
298
- cellContents.push(...ElementUtil.getChildrenElements(currCell));
299
- currCell.clearItems();
300
- }
301
- }
302
- }
303
- //如果合并的单元格都是空段落,则不合并内容
304
- if (!cellContents.every((item) => (item instanceof ParagraphElement && item.length === 1))) {
305
- for (let i = 0; i < cellContents.length; i++) {
306
- startCell.addChild(cellContents[i]);
307
- }
308
- }
309
- }
310
- static canSplitCell(ss) {
311
- const { ancestorCommonControl, startControl, endControl, collapsed } = ss;
312
- if (ancestorCommonControl instanceof TableElement || ancestorCommonControl instanceof TableRowElement) {
313
- const tbElement = ancestorCommonControl instanceof TableElement ? ancestorCommonControl : ancestorCommonControl.parent;
314
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
315
- const endCell = ElementUtil.getParentByType(endControl, TableCellElement);
316
- if (startCell?.parent?.parent === tbElement && endCell?.parent?.parent === tbElement) {
317
- if (startCell === endCell) {
318
- return startCell.props.hMerge === 'restart' || startCell.props.vMerge === 'restart';
319
- }
320
- }
321
- }
322
- else {
323
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
324
- if (!startCell) {
325
- throw new Error('startCell is null');
326
- }
327
- const { hMerge, vMerge } = startCell?.props;
328
- return hMerge === 'restart' || vMerge === 'restart' || !hMerge || !vMerge;
329
- }
330
- return false;
331
- }
332
- /**
333
- * 将合并的单元格合并还原
334
- * @param ss
335
- */
336
- static restoreCell(ss) {
337
- const { ancestorCommonControl, startControl, endControl, collapsed } = ss;
338
- const startCell = ElementUtil.getParentByType(startControl, TableCellElement);
339
- if (startCell) {
340
- this.restoreCellMerge(startCell);
341
- ss.resetRange(startCell, 0);
342
- startCell.refreshView();
343
- }
344
- }
345
- static restoreCellMerge(cell) {
346
- const { vMerge, hMerge } = cell.props;
347
- const row = cell.parent;
348
- const tb = row.parent;
349
- const rowIndex = row.getIndex();
350
- const colIndex = cell.getIndex();
351
- if (vMerge === 'restart') {
352
- for (let i = rowIndex + 1; i < tb.length; i++) {
353
- const row = tb.getChild(i);
354
- const cell = row.getChild(colIndex);
355
- if (cell.props.vMerge === "continue") {
356
- cell.props.vMerge = null;
357
- if (cell.props.hMerge === "restart") {
358
- this.restoreCellMerge(cell);
359
- }
360
- }
361
- }
362
- }
363
- if (hMerge === 'restart') {
364
- for (let i = colIndex + 1; i < row.length; i++) {
365
- const cell = row.getChild(i);
366
- if (cell.props.hMerge === "continue") {
367
- cell.props.hMerge = null;
368
- if (cell.props.vMerge === "restart") {
369
- this.restoreCellMerge(cell);
370
- }
371
- }
372
- }
373
- }
374
- cell.props.hMerge = null;
375
- cell.props.vMerge = null;
376
- }
377
- static getVMergeRows(tb, masterRowIndex, masterColIndex) {
378
- const items = [];
379
- for (let i = masterRowIndex + 1; i < tb.length; i++) {
380
- const row = tb.getChild(i);
381
- const cell = row.getChild(masterColIndex);
382
- if (cell.props.vMerge === 'continue') {
383
- items.push(row);
384
- }
385
- else {
386
- return items;
387
- }
388
- }
389
- return items;
390
- }
391
- static insertCol(ss, insertColIndex) {
392
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
393
- if (!startCell?.parent) {
394
- throw new Error('parent is null');
395
- }
396
- const startRow = startCell.parent;
397
- const tb = startRow.parent;
398
- const currColIndex = startCell.getIndex();
399
- const colsCount = tb.getColsCount();
400
- insertColIndex = insertColIndex < 0 ? 0 : insertColIndex;
401
- insertColIndex = insertColIndex > colsCount ? colsCount : insertColIndex;
402
- //插入列需要将之前列分割
403
- const insertColWidth = insertColIndex === colsCount ? tb.getCellWidth(colsCount - 1) : tb.getCellWidth(insertColIndex);
404
- const newColWidth = Math.floor(insertColWidth / 2);
405
- if (newColWidth < 20) {
406
- console.warn('插入列的最小宽度不能小于20,当前为:' + newColWidth);
407
- return;
408
- }
409
- for (let i = 0; i < tb.length; i++) {
410
- const row = tb.getChild(i);
411
- const newCell = new TableCellElement();
412
- if (insertColIndex === 0 || insertColIndex === colsCount) {
413
- row.addChild(newCell, insertColIndex);
414
- continue;
415
- }
416
- const focusCell = row.getChild(insertColIndex);
417
- if (focusCell) {
418
- if (focusCell.props.hMerge === 'continue') {
419
- //获取合并行的最后的行索引
420
- const hMergeEndColIndex = this.getHMergeEndIndex(tb, i, currColIndex);
421
- if (hMergeEndColIndex > insertColIndex || (hMergeEndColIndex === insertColIndex && currColIndex < insertColIndex)) {
422
- newCell.props.hMerge = 'continue';
423
- }
424
- }
425
- else if (focusCell.props.hMerge === 'restart' && currColIndex > insertColIndex) {
426
- newCell.props.hMerge = 'continue';
427
- }
428
- }
429
- row.addChild(newCell, insertColIndex);
430
- }
431
- tb.setCellWidth(insertColIndex === colsCount ? insertColIndex - 1 : insertColIndex, insertColWidth - newColWidth);
432
- tb.insertCol(insertColIndex, newColWidth);
433
- tb.pubOnChange('self');
434
- tb.refreshView();
435
- }
436
- static insertRow(ss, insertRowIndex) {
437
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
438
- if (!startCell?.parent) {
439
- throw new Error('parent is null');
440
- }
441
- const startRow = startCell.parent;
442
- const tb = startRow.parent;
443
- const currRowIndex = startRow.getIndex();
444
- insertRowIndex = insertRowIndex < 0 ? 0 : insertRowIndex;
445
- insertRowIndex = insertRowIndex > tb.length ? tb.length : insertRowIndex;
446
- const newRow = TableRowElement.createRow(tb.getColsCount());
447
- //新行插在第一行或者最后一行
448
- if (insertRowIndex === 0 || insertRowIndex === tb.length) {
449
- tb.addChild(newRow, insertRowIndex);
450
- tb.refreshView();
451
- return newRow;
452
- }
453
- const destRow = tb.getChild(insertRowIndex);
454
- for (let i = 0; i < destRow.length; i++) {
455
- const destCell = destRow.getChild(i);
456
- const newCell = newRow.getChild(i);
457
- //如果当前单元格是普通单元格或者合并列的最后一个单元格,则不做处理
458
- if (destCell.props.vMerge === 'continue') {
459
- //获取合并列的最后的行索引
460
- const vMergeEndRowIndex = this.getVMergeEndIndex(tb, insertRowIndex, i);
461
- if (vMergeEndRowIndex > insertRowIndex || (vMergeEndRowIndex === insertRowIndex && currRowIndex < insertRowIndex)) {
462
- newCell.props.vMerge = 'continue';
463
- //newCell.cellProps.hMerge = destCell.cellProps.hMerge;
464
- }
465
- }
466
- else if (destCell.props.vMerge === 'restart' && currRowIndex > insertRowIndex) {
467
- //在上方新增行,目标行单元格属于合并的起点
468
- newCell.props.vMerge = 'continue';
469
- //newCell.cellProps.hMerge = destCell.cellProps.hMerge;
470
- }
471
- }
472
- tb.addChild(newRow, insertRowIndex);
473
- tb.refreshView();
474
- return newRow;
475
- }
476
- /**
477
- * 在下方插入行
478
- */
479
- static insertRowBelow(ss) {
480
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
481
- if (!startCell?.parent) {
482
- throw new Error('parent is null');
483
- }
484
- const startRow = startCell.parent;
485
- const currRowIndex = startRow.getIndex();
486
- this.insertRow(ss, currRowIndex + 1);
487
- }
488
- /**
489
- * 在上方插入行
490
- */
491
- static insertRowAbove(ss) {
492
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
493
- if (!startCell?.parent) {
494
- throw new Error('parent is null');
495
- }
496
- const startRow = startCell.parent;
497
- const currRowIndex = startRow.getIndex();
498
- this.insertRow(ss, currRowIndex);
499
- }
500
- /**
501
- * 在右侧插入列
502
- */
503
- static insertColToRight(ss) {
504
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
505
- if (!startCell?.parent) {
506
- throw new Error('parent is null');
507
- }
508
- const currColIndex = startCell.getIndex();
509
- this.insertCol(ss, currColIndex + 1);
510
- }
511
- /**
512
- * 在左侧插入列
513
- */
514
- static insertColToLeft(ss) {
515
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
516
- if (!startCell?.parent) {
517
- throw new Error('parent is null');
518
- }
519
- const currColIndex = startCell.getIndex();
520
- this.insertCol(ss, currColIndex);
521
- }
522
- /**
523
- * 跳转到下一个单元格中
524
- * @param ss
525
- */
526
- static moveNextCell(ss) {
527
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
528
- if (!startCell?.parent) {
529
- throw new Error('parent is null');
530
- }
531
- const rowIndex = startCell.parent.getIndex();
532
- const nextCell = this.getNextCell(ss);
533
- if (nextCell) {
534
- ss.resetRange(nextCell, 0);
535
- nextCell.refreshView();
536
- return;
537
- }
538
- //新增行,并定位
539
- const newRow = this.insertRow(ss, rowIndex + 1);
540
- ss.resetRange(newRow, 0);
541
- newRow.refreshView();
542
- }
543
- /**
544
- * 获取下一个可定位的单元格
545
- * @param ss
546
- * @returns
547
- */
548
- static getNextCell(ss) {
549
- const startCell = ElementUtil.getParentByType(ss.startControl, TableCellElement);
550
- if (!startCell?.parent) {
551
- throw new Error('parent is null');
552
- }
553
- const rowIndex = startCell.parent.getIndex();
554
- const colIndex = startCell.getIndex();
555
- const tb = startCell.parent.parent;
556
- for (let i = rowIndex; i < tb.length; i++) {
557
- let j = i === rowIndex ? colIndex + 1 : 0;
558
- const currRow = tb.getChild(i);
559
- for (; j < tb.getColsCount(); j++) {
560
- const currCell = currRow.getChild(j);
561
- if (currCell.isNotBeMergedCell()) {
562
- return currCell;
563
- }
564
- }
565
- }
566
- //throw new Error('getNextCell is null')
567
- }
568
- /**
569
- * 当前光标是否在最后一个单元格中
570
- */
571
- static isLastVisiableCell(ss) {
572
- return !this.getNextCell(ss);
573
- }
574
- /**
575
- * 移除当前table
576
- */
577
- static removeTable(ss) {
578
- const tb = ElementUtil.getParentByType(ss.startControl, TableElement);
579
- if (!tb) {
580
- console.warn('当前位置不存在表格');
581
- return;
582
- }
583
- tb.parent.refreshView();
584
- tb.remove();
585
- }
586
- /**
587
- * 设置表格单元格对角线
588
- * @param ss
589
- * @param diagonal
590
- * @returns
591
- */
592
- static setTableCellDiagonal(ss, diagonal) {
593
- const tc = ElementUtil.getParentByType(ss.startControl, TableCellElement);
594
- if (!tc) {
595
- console.warn('当前位置不存在表格');
596
- return;
597
- }
598
- if (!tc.props.diagonal || tc.props.diagonal !== diagonal) {
599
- tc.props.diagonal = diagonal;
600
- }
601
- else if (tc.props.diagonal === diagonal) {
602
- tc.props.diagonal = null;
603
- }
604
- tc.refreshView();
605
- }
606
- /**
607
- * 将当前表格截断成两个相邻的表格
608
- * @param tb
609
- * @param rowIndex
610
- */
611
- static cutTable(tb, rowIndex) {
612
- if (rowIndex === 0 || rowIndex === tb.length - 1) {
613
- return;
614
- }
615
- const newTb = tb.clone(false);
616
- const len = tb.length - 1;
617
- while (len > rowIndex) {
618
- const child = tb.getChild(len);
619
- newTb.addChild(child.clone(true), 0);
620
- tb.removeChild(child);
621
- }
622
- if (newTb.length > 0) {
623
- tb.parent.addChild(newTb, tb.getIndex() + 1);
624
- }
625
- }
626
- /**
627
- * 获取表格选区区域最大的矩形区域
628
- * @param tb
629
- * @param startCell
630
- * @param endCell
631
- * @returns
632
- */
633
- static getTableRectSelectedRegion(tb, startCell, endCell) {
634
- let startRow = startCell.parent.getIndex();
635
- let startCol = startCell.getIndex();
636
- let endRow = endCell.parent.getIndex();
637
- let endCol = endCell.getIndex();
638
- if (startRow > endRow) {
639
- [endRow, startRow] = [startRow, endRow];
640
- }
641
- if (startCol > endCol) {
642
- [endCol, startCol] = [startCol, endCol];
643
- }
644
- for (let i = startRow; i <= endRow; i++) {
645
- const row = tb.getChild(i);
646
- for (let j = startCol; j <= endCol; j++) {
647
- const cell = row.getChild(j);
648
- const { hMerge, vMerge } = cell.props;
649
- if (hMerge === 'continue') {
650
- const startColIndex = TableUtil.getHMergeStartIndex(tb, i, j);
651
- const endColIndex = TableUtil.getHMergeEndIndex(tb, i, j);
652
- startCol = Math.min(startCol, startColIndex);
653
- endCol = Math.max(endCol, endColIndex);
654
- }
655
- if (vMerge === 'continue') {
656
- const startRowIndex = TableUtil.getVMergeStartIndex(tb, i, j);
657
- const endRowIndex = TableUtil.getVMergeEndIndex(tb, i, j);
658
- startRow = Math.min(startRow, startRowIndex);
659
- endRow = Math.max(endRow, endRowIndex);
660
- }
661
- if (vMerge === 'restart') {
662
- const rowIndex = TableUtil.getVMergeEndIndex(tb, i, j);
663
- if (rowIndex > endRow) {
664
- endRow = rowIndex;
665
- }
666
- }
667
- if (hMerge === 'restart') {
668
- const colIndex = TableUtil.getHMergeEndIndex(tb, i, j);
669
- if (colIndex > endCol) {
670
- endCol = colIndex;
671
- }
672
- }
673
- }
674
- }
675
- return { startRow, endRow, startCol, endCol };
676
- }
677
- }
678
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdXRpbC5qcyIsInNvdXJjZVJvb3QiOiJsaWIvIiwic291cmNlcyI6WyJmcmFtZXdvcmsvaW1wbC90YWJsZS90YWJsZS11dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUduRCxNQUFNLE9BQU8sU0FBUztJQUVsQixNQUFNLENBQUMsY0FBYyxDQUFDLEVBQWtCO1FBQ3BDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbkUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFrQjtRQUNuQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3pGLElBQUksU0FBUyxFQUFFO1lBQ1gsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLHFCQUFxQixZQUFZLFlBQVksSUFBSSxxQkFBcUIsWUFBWSxlQUFlLEVBQUU7WUFDbkcsTUFBTSxTQUFTLEdBQUcscUJBQXFCLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMs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