@ngxsmk/cdk 1.3.2 → 2.0.0

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 (173) hide show
  1. package/cva-base/cva-base.d.ts +34 -0
  2. package/cva-base/cva-base.d.ts.map +1 -0
  3. package/cva-base/index.d.ts +2 -0
  4. package/cva-base/index.d.ts.map +1 -0
  5. package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
  6. package/esm2022/cva-base/cva-base.mjs +45 -0
  7. package/esm2022/cva-base/index.mjs +2 -0
  8. package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
  9. package/esm2022/input-group/index.mjs +3 -0
  10. package/esm2022/input-group/input-group-engine.mjs +219 -0
  11. package/esm2022/input-group/models/index.mjs +2 -0
  12. package/esm2022/input-group/models/input-group.model.mjs +2 -0
  13. package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
  14. package/esm2022/listbox-keyboard/index.mjs +2 -0
  15. package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
  16. package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
  17. package/esm2022/public-api.mjs +10 -1
  18. package/esm2022/scheduler/index.mjs +5 -0
  19. package/esm2022/scheduler/models/date-range.mjs +2 -0
  20. package/esm2022/scheduler/models/event.model.mjs +2 -0
  21. package/esm2022/scheduler/models/index.mjs +6 -0
  22. package/esm2022/scheduler/models/resource.model.mjs +5 -0
  23. package/esm2022/scheduler/models/selection.model.mjs +7 -0
  24. package/esm2022/scheduler/models/view.model.mjs +7 -0
  25. package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
  26. package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
  27. package/esm2022/scheduler/plugin/index.mjs +8 -0
  28. package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
  29. package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
  30. package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
  31. package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
  32. package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
  33. package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
  34. package/esm2022/scheduler/scheduler-engine.mjs +316 -0
  35. package/esm2022/scheduler/utils/date-utils.mjs +131 -0
  36. package/esm2022/scheduler/utils/index.mjs +3 -0
  37. package/esm2022/scheduler/utils/snap.mjs +24 -0
  38. package/esm2022/spreadsheet/index.mjs +5 -0
  39. package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
  40. package/esm2022/spreadsheet/models/column.model.mjs +2 -0
  41. package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
  42. package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
  43. package/esm2022/spreadsheet/models/index.mjs +8 -0
  44. package/esm2022/spreadsheet/models/row.model.mjs +2 -0
  45. package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
  46. package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
  47. package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
  48. package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
  49. package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
  50. package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
  51. package/esm2022/spreadsheet/plugin/index.mjs +10 -0
  52. package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
  53. package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
  54. package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
  55. package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
  56. package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
  57. package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
  58. package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
  59. package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
  60. package/esm2022/spreadsheet/utils/index.mjs +2 -0
  61. package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
  62. package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
  63. package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
  64. package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
  65. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
  66. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
  67. package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
  68. package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
  69. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
  70. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
  71. package/fesm2022/ngxsmk-cdk.mjs +5 -0
  72. package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
  73. package/input-group/index.d.ts +3 -0
  74. package/input-group/index.d.ts.map +1 -0
  75. package/input-group/input-group-engine.d.ts +88 -0
  76. package/input-group/input-group-engine.d.ts.map +1 -0
  77. package/input-group/models/index.d.ts +2 -0
  78. package/input-group/models/index.d.ts.map +1 -0
  79. package/input-group/models/input-group.model.d.ts +114 -0
  80. package/input-group/models/input-group.model.d.ts.map +1 -0
  81. package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
  82. package/listbox-keyboard/index.d.ts +2 -0
  83. package/listbox-keyboard/index.d.ts.map +1 -0
  84. package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
  85. package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
  86. package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
  87. package/package.json +41 -11
  88. package/public-api.d.ts +8 -0
  89. package/public-api.d.ts.map +1 -1
  90. package/scheduler/index.d.ts +5 -0
  91. package/scheduler/index.d.ts.map +1 -0
  92. package/scheduler/models/date-range.d.ts +6 -0
  93. package/scheduler/models/date-range.d.ts.map +1 -0
  94. package/scheduler/models/event.model.d.ts +50 -0
  95. package/scheduler/models/event.model.d.ts.map +1 -0
  96. package/scheduler/models/index.d.ts +6 -0
  97. package/scheduler/models/index.d.ts.map +1 -0
  98. package/scheduler/models/resource.model.d.ts +16 -0
  99. package/scheduler/models/resource.model.d.ts.map +1 -0
  100. package/scheduler/models/selection.model.d.ts +12 -0
  101. package/scheduler/models/selection.model.d.ts.map +1 -0
  102. package/scheduler/models/view.model.d.ts +21 -0
  103. package/scheduler/models/view.model.d.ts.map +1 -0
  104. package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
  105. package/scheduler/plugin/drag-plugin.d.ts +28 -0
  106. package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
  107. package/scheduler/plugin/index.d.ts +8 -0
  108. package/scheduler/plugin/index.d.ts.map +1 -0
  109. package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
  110. package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
  111. package/scheduler/plugin/plugin-host.d.ts +16 -0
  112. package/scheduler/plugin/plugin-host.d.ts.map +1 -0
  113. package/scheduler/plugin/plugin.types.d.ts +9 -0
  114. package/scheduler/plugin/plugin.types.d.ts.map +1 -0
  115. package/scheduler/plugin/resize-plugin.d.ts +26 -0
  116. package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
  117. package/scheduler/plugin/selection-plugin.d.ts +40 -0
  118. package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
  119. package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
  120. package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
  121. package/scheduler/scheduler-engine.d.ts +95 -0
  122. package/scheduler/scheduler-engine.d.ts.map +1 -0
  123. package/scheduler/utils/date-utils.d.ts +26 -0
  124. package/scheduler/utils/date-utils.d.ts.map +1 -0
  125. package/scheduler/utils/index.d.ts +3 -0
  126. package/scheduler/utils/index.d.ts.map +1 -0
  127. package/scheduler/utils/snap.d.ts +7 -0
  128. package/scheduler/utils/snap.d.ts.map +1 -0
  129. package/spreadsheet/index.d.ts +5 -0
  130. package/spreadsheet/index.d.ts.map +1 -0
  131. package/spreadsheet/models/cell.model.d.ts +44 -0
  132. package/spreadsheet/models/cell.model.d.ts.map +1 -0
  133. package/spreadsheet/models/column.model.d.ts +77 -0
  134. package/spreadsheet/models/column.model.d.ts.map +1 -0
  135. package/spreadsheet/models/filter.model.d.ts +15 -0
  136. package/spreadsheet/models/filter.model.d.ts.map +1 -0
  137. package/spreadsheet/models/formula.model.d.ts +65 -0
  138. package/spreadsheet/models/formula.model.d.ts.map +1 -0
  139. package/spreadsheet/models/index.d.ts +8 -0
  140. package/spreadsheet/models/index.d.ts.map +1 -0
  141. package/spreadsheet/models/row.model.d.ts +33 -0
  142. package/spreadsheet/models/row.model.d.ts.map +1 -0
  143. package/spreadsheet/models/selection.model.d.ts +18 -0
  144. package/spreadsheet/models/selection.model.d.ts.map +1 -0
  145. package/spreadsheet/models/sort.model.d.ts +14 -0
  146. package/spreadsheet/models/sort.model.d.ts.map +1 -0
  147. package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
  148. package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
  149. package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
  150. package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
  151. package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
  152. package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
  153. package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
  154. package/spreadsheet/plugin/index.d.ts +10 -0
  155. package/spreadsheet/plugin/index.d.ts.map +1 -0
  156. package/spreadsheet/plugin/plugin-host.d.ts +66 -0
  157. package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
  158. package/spreadsheet/plugin/plugin.types.d.ts +58 -0
  159. package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
  160. package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
  161. package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
  162. package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
  163. package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
  164. package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
  165. package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
  166. package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
  167. package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
  168. package/spreadsheet/spreadsheet-engine.d.ts +194 -0
  169. package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
  170. package/spreadsheet/utils/cell-utils.d.ts +26 -0
  171. package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
  172. package/spreadsheet/utils/index.d.ts +2 -0
  173. package/spreadsheet/utils/index.d.ts.map +1 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * PluginHost manages the lifecycle of all registered plugins.
3
+ * Plugins are executed in priority order (lower = first).
4
+ */
5
+ export class PluginHost {
6
+ constructor() {
7
+ this._plugins = [];
8
+ this._engine = null;
9
+ }
10
+ /** Register one or more plugins. */
11
+ register(...plugins) {
12
+ this._plugins.push(...plugins);
13
+ this._plugins.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
14
+ }
15
+ /** Unregister plugins by name. */
16
+ unregister(...names) {
17
+ const nameSet = new Set(names);
18
+ const toRemove = this._plugins.filter((p) => nameSet.has(p.name));
19
+ toRemove.forEach((p) => p.onDestroy?.());
20
+ this._plugins = this._plugins.filter((p) => !nameSet.has(p.name));
21
+ }
22
+ /** Initialize all plugins with the engine. Called once during engine construction. */
23
+ init(engine) {
24
+ this._engine = engine;
25
+ for (const plugin of this._plugins) {
26
+ plugin.onInit?.(engine);
27
+ }
28
+ }
29
+ /** Destroy all plugins. */
30
+ destroy() {
31
+ for (const plugin of this._plugins) {
32
+ plugin.onDestroy?.();
33
+ }
34
+ this._plugins = [];
35
+ this._engine = null;
36
+ }
37
+ /** Run onBeforeRender on all plugins. Returns false if any plugin cancels. */
38
+ beforeRender() {
39
+ for (const plugin of this._plugins) {
40
+ if (plugin.onBeforeRender?.() === false)
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+ /** Run onAfterRender on all plugins. */
46
+ afterRender() {
47
+ for (const plugin of this._plugins) {
48
+ plugin.onAfterRender?.();
49
+ }
50
+ }
51
+ /** Run onBeforeEdit on all plugins. Returns false if any cancels. */
52
+ beforeEdit(rowIndex, colId) {
53
+ for (const plugin of this._plugins) {
54
+ if (plugin.onBeforeEdit?.(rowIndex, colId) === false)
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+ /** Run onAfterEdit on all plugins. */
60
+ afterEdit(rowIndex, colId, oldValue, newValue) {
61
+ for (const plugin of this._plugins) {
62
+ plugin.onAfterEdit?.(rowIndex, colId, oldValue, newValue);
63
+ }
64
+ }
65
+ /** Run onBeforeSort on all plugins. Returns false if any cancels. */
66
+ beforeSort(colId, direction) {
67
+ for (const plugin of this._plugins) {
68
+ if (plugin.onBeforeSort?.(colId, direction) === false)
69
+ return false;
70
+ }
71
+ return true;
72
+ }
73
+ /** Run onAfterSort on all plugins. */
74
+ afterSort() {
75
+ for (const plugin of this._plugins) {
76
+ plugin.onAfterSort?.();
77
+ }
78
+ }
79
+ /** Run onBeforeFilter on all plugins. Returns false if any cancels. */
80
+ beforeFilter() {
81
+ for (const plugin of this._plugins) {
82
+ if (plugin.onBeforeFilter?.() === false)
83
+ return false;
84
+ }
85
+ return true;
86
+ }
87
+ /** Run onAfterFilter on all plugins. */
88
+ afterFilter() {
89
+ for (const plugin of this._plugins) {
90
+ plugin.onAfterFilter?.();
91
+ }
92
+ }
93
+ /** Run onBeforeInsertRows on all plugins. Returns false if any cancels. */
94
+ beforeInsertRows(count, atIndex) {
95
+ for (const plugin of this._plugins) {
96
+ if (plugin.onBeforeInsertRows?.(count, atIndex) === false)
97
+ return false;
98
+ }
99
+ return true;
100
+ }
101
+ /** Run onAfterInsertRows on all plugins. */
102
+ afterInsertRows(indices) {
103
+ for (const plugin of this._plugins) {
104
+ plugin.onAfterInsertRows?.(indices);
105
+ }
106
+ }
107
+ /** Run onBeforeDeleteRows on all plugins. Returns false if any cancels. */
108
+ beforeDeleteRows(indices) {
109
+ for (const plugin of this._plugins) {
110
+ if (plugin.onBeforeDeleteRows?.(indices) === false)
111
+ return false;
112
+ }
113
+ return true;
114
+ }
115
+ /** Run onAfterDeleteRows on all plugins. */
116
+ afterDeleteRows(indices) {
117
+ for (const plugin of this._plugins) {
118
+ plugin.onAfterDeleteRows?.(indices);
119
+ }
120
+ }
121
+ /** Run onBeforeInsertColumns on all plugins. Returns false if any cancels. */
122
+ beforeInsertColumns(count, atIndex) {
123
+ for (const plugin of this._plugins) {
124
+ if (plugin.onBeforeInsertColumns?.(count, atIndex) === false)
125
+ return false;
126
+ }
127
+ return true;
128
+ }
129
+ /** Run onAfterInsertColumns on all plugins. */
130
+ afterInsertColumns(indices) {
131
+ for (const plugin of this._plugins) {
132
+ plugin.onAfterInsertColumns?.(indices);
133
+ }
134
+ }
135
+ /** Run onBeforeDeleteColumns on all plugins. Returns false if any cancels. */
136
+ beforeDeleteColumns(indices) {
137
+ for (const plugin of this._plugins) {
138
+ if (plugin.onBeforeDeleteColumns?.(indices) === false)
139
+ return false;
140
+ }
141
+ return true;
142
+ }
143
+ /** Run onAfterDeleteColumns on all plugins. */
144
+ afterDeleteColumns(indices) {
145
+ for (const plugin of this._plugins) {
146
+ plugin.onAfterDeleteColumns?.(indices);
147
+ }
148
+ }
149
+ /** Run onBeforePaste on all plugins. Returns false if any cancels. */
150
+ beforePaste(data, startCell) {
151
+ for (const plugin of this._plugins) {
152
+ if (plugin.onBeforePaste?.(data, startCell) === false)
153
+ return false;
154
+ }
155
+ return true;
156
+ }
157
+ /** Run onAfterPaste on all plugins. */
158
+ afterPaste() {
159
+ for (const plugin of this._plugins) {
160
+ plugin.onAfterPaste?.();
161
+ }
162
+ }
163
+ /** Run onBeforeCopy on all plugins. Returns false if any cancels. */
164
+ beforeCopy() {
165
+ for (const plugin of this._plugins) {
166
+ if (plugin.onBeforeCopy?.() === false)
167
+ return false;
168
+ }
169
+ return true;
170
+ }
171
+ /** Run onAfterCopy on all plugins. */
172
+ afterCopy() {
173
+ for (const plugin of this._plugins) {
174
+ plugin.onAfterCopy?.();
175
+ }
176
+ }
177
+ /** Fire a custom event to all plugins. */
178
+ fireEvent(eventType, payload) {
179
+ for (const plugin of this._plugins) {
180
+ plugin.onEvent?.(eventType, payload);
181
+ }
182
+ }
183
+ /** Get all registered plugins. */
184
+ get plugins() {
185
+ return this._plugins;
186
+ }
187
+ }
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL3BsdWdpbi1ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQXZCO1FBQ1UsYUFBUSxHQUF3QixFQUFFLENBQUM7UUFDbkMsWUFBTyxHQUE2QixJQUFJLENBQUM7SUFrTW5ELENBQUM7SUFoTUMsb0NBQW9DO0lBQ3BDLFFBQVEsQ0FBQyxHQUFHLE9BQTRCO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxVQUFVLENBQUMsR0FBRyxLQUFlO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENB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QVU7UUFDUixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxVQUFVO1FBQ1IsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsS0FBSyxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsU0FBUztRQUNQLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLFNBQVMsQ0FBQyxTQUFpQixFQUFFLE9BQWdCO1FBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi50eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFNwcmVhZHNoZWV0RW5naW5lIH0gZnJvbSAnLi4vc3ByZWFkc2hlZXQtZW5naW5lJztcblxuLyoqXG4gKiBQbHVnaW5Ib3N0IG1hbmFnZXMgdGhlIGxpZmVjeWNsZSBvZiBhbGwgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICogUGx1Z2lucyBhcmUgZXhlY3V0ZWQgaW4gcHJpb3JpdHkgb3JkZXIgKGxvd2VyID0gZmlyc3QpLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luSG9zdCB7XG4gIHByaXZhdGUgX3BsdWdpbnM6IFNwcmVhZHNoZWV0UGx1Z2luW10gPSBbXTtcbiAgcHJpdmF0ZSBfZW5naW5lOiBTcHJlYWRzaGVldEVuZ2luZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBSZWdpc3RlciBvbmUgb3IgbW9yZSBwbHVnaW5zLiAqL1xuICByZWdpc3RlciguLi5wbHVnaW5zOiBTcHJlYWRzaGVldFBsdWdpbltdKTogdm9pZCB7XG4gICAgdGhpcy5fcGx1Z2lucy5wdXNoKC4uLnBsdWdpbnMpO1xuICAgIHRoaXMuX3BsdWdpbnMuc29ydCgoYSwgYikgPT4gKGEucHJpb3JpdHkgPz8gMCkgLSAoYi5wcmlvcml0eSA/PyAwKSk7XG4gIH1cblxuICAvKiogVW5yZWdpc3RlciBwbHVnaW5zIGJ5IG5hbWUuICovXG4gIHVucmVnaXN0ZXIoLi4ubmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZVNldCA9IG5ldyBTZXQobmFtZXMpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5fcGx1Z2lucy5maWx0ZXIoKHApID0+IG5hbWVTZXQuaGFzKHAubmFtZSkpO1xuICAgIHRvUmVtb3ZlLmZvckVhY2goKHApID0+IHAub25EZXN0cm95Py4oKSk7XG4gICAgdGhpcy5fcGx1Z2lucyA9IHRoaXMuX3BsdWdpbnMuZmlsdGVyKChwKSA9PiAhbmFtZVNldC5oYXMocC5uYW1lKSk7XG4gIH1cblxuICAvKiogSW5pdGlhbGl6ZSBhbGwgcGx1Z2lucyB3aXRoIHRoZSBlbmdpbmUuIENhbGxlZCBvbmNlIGR1cmluZyBlbmdpbmUgY29uc3RydWN0aW9uLiAqL1xuICBpbml0KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uSW5pdD8uKGVuZ2luZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERlc3Ryb3kgYWxsIHBsdWdpbnMuICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uRGVzdHJveT8uKCk7XG4gICAgfVxuICAgIHRoaXMuX3BsdWdpbnMgPSBbXTtcbiAgICB0aGlzLl9lbmdpbmUgPSBudWxsO1xuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZVJlbmRlciBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgcGx1Z2luIGNhbmNlbHMuICovXG4gIGJlZm9yZVJlbmRlcigpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlUmVuZGVyPy4oKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJSZW5kZXIgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyUmVuZGVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyUmVuZGVyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUnVuIG9uQmVmb3JlRWRpdCBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlRWRpdChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgaWYgKHBsdWdpbi5vbkJlZm9yZUVkaXQ/Lihyb3dJbmRleCwgY29sSWQpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlckVkaXQgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyRWRpdChyb3dJbmRleDogbnVtYmVyLCBjb2xJZDogc3RyaW5nLCBvbGRWYWx1ZTogdW5rbm93biwgbmV3VmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBwbHVnaW4ub25BZnRlckVkaXQ/Lihyb3dJbmRleCwgY29sSWQsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZVNvcnQgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZVNvcnQoY29sSWQ6IHN0cmluZywgZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlU29ydD8uKGNvbElkLCBkaXJlY3Rpb24pID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlclNvcnQgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyU29ydCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBwbHVnaW4ub25BZnRlclNvcnQ/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gb25CZWZvcmVGaWx0ZXIgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlRmlsdGVyPy4oKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJGaWx0ZXIgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyRmlsdGVyKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyRmlsdGVyPy4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogUnVuIG9uQmVmb3JlSW5zZXJ0Um93cyBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlSW5zZXJ0Um93cyhjb3VudDogbnVtYmVyLCBhdEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlSW5zZXJ0Um93cz8uKGNvdW50LCBhdEluZGV4KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJJbnNlcnRSb3dzIG9uIGFsbCBwbHVnaW5zLiAqL1xuICBhZnRlckluc2VydFJvd3MoaW5kaWNlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBwbHVnaW4ub25BZnRlckluc2VydFJvd3M/LihpbmRpY2VzKTtcbiAgICB9XG4gIH1cblxuICAvKiogUnVuIG9uQmVmb3JlRGVsZXRlUm93cyBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlRGVsZXRlUm93cyhpbmRpY2VzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIGlmIChwbHVnaW4ub25CZWZvcmVEZWxldGVSb3dzPy4oaW5kaWNlcykgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJ1biBvbkFmdGVyRGVsZXRlUm93cyBvbiBhbGwgcGx1Z2lucy4gKi9cbiAgYWZ0ZXJEZWxldGVSb3dzKGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uQWZ0ZXJEZWxldGVSb3dzPy4oaW5kaWNlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZUluc2VydENvbHVtbnMgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZUluc2VydENvbHVtbnMoY291bnQ6IG51bWJlciwgYXRJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgaWYgKHBsdWdpbi5vbkJlZm9yZUluc2VydENvbHVtbnM/Lihjb3VudCwgYXRJbmRleCkgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJ1biBvbkFmdGVySW5zZXJ0Q29sdW1ucyBvbiBhbGwgcGx1Z2lucy4gKi9cbiAgYWZ0ZXJJbnNlcnRDb2x1bW5zKGluZGljZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uQWZ0ZXJJbnNlcnRDb2x1bW5zPy4oaW5kaWNlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBvbkJlZm9yZURlbGV0ZUNvbHVtbnMgb24gYWxsIHBsdWdpbnMuIFJldHVybnMgZmFsc2UgaWYgYW55IGNhbmNlbHMuICovXG4gIGJlZm9yZURlbGV0ZUNvbHVtbnMoaW5kaWNlczogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlRGVsZXRlQ29sdW1ucz8uKGluZGljZXMpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlckRlbGV0ZUNvbHVtbnMgb24gYWxsIHBsdWdpbnMuICovXG4gIGFmdGVyRGVsZXRlQ29sdW1ucyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyRGVsZXRlQ29sdW1ucz8uKGluZGljZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gb25CZWZvcmVQYXN0ZSBvbiBhbGwgcGx1Z2lucy4gUmV0dXJucyBmYWxzZSBpZiBhbnkgY2FuY2Vscy4gKi9cbiAgYmVmb3JlUGFzdGUoZGF0YTogc3RyaW5nLCBzdGFydENlbGw6IHsgcm93OiBudW1iZXI7IGNvbDogbnVtYmVyIH0pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLl9wbHVnaW5zKSB7XG4gICAgICBpZiAocGx1Z2luLm9uQmVmb3JlUGFzdGU/LihkYXRhLCBzdGFydENlbGwpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSdW4gb25BZnRlclBhc3RlIG9uIGFsbCBwbHVnaW5zLiAqL1xuICBhZnRlclBhc3RlKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5vbkFmdGVyUGFzdGU/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gb25CZWZvcmVDb3B5IG9uIGFsbCBwbHVnaW5zLiBSZXR1cm5zIGZhbHNlIGlmIGFueSBjYW5jZWxzLiAqL1xuICBiZWZvcmVDb3B5KCk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuX3BsdWdpbnMpIHtcbiAgICAgIGlmIChwbHVnaW4ub25CZWZvcmVDb3B5Py4oKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUnVuIG9uQWZ0ZXJDb3B5IG9uIGFsbCBwbHVnaW5zLiAqL1xuICBhZnRlckNvcHkoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uQWZ0ZXJDb3B5Py4oKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmlyZSBhIGN1c3RvbSBldmVudCB0byBhbGwgcGx1Z2lucy4gKi9cbiAgZmlyZUV2ZW50KGV2ZW50VHlwZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2YgdGhpcy5fcGx1Z2lucykge1xuICAgICAgcGx1Z2luLm9uRXZlbnQ/LihldmVudFR5cGUsIHBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBHZXQgYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy4gKi9cbiAgZ2V0IHBsdWdpbnMoKTogcmVhZG9ubHkgU3ByZWFkc2hlZXRQbHVnaW5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3BsdWdpbnM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY2RrL3NwcmVhZHNoZWV0L3BsdWdpbi9wbHVnaW4udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRFbmdpbmUgfSBmcm9tICcuLi9zcHJlYWRzaGVldC1lbmdpbmUnO1xuXG4vKiogUGx1Z2luIGxpZmVjeWNsZSBpbnRlcmZhY2UuIEV2ZXJ5IHNwcmVhZHNoZWV0IHBsdWdpbiBtdXN0IGltcGxlbWVudCB0aGlzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcHJlYWRzaGVldFBsdWdpbiB7XG4gIC8qKiBVbmlxdWUgcGx1Z2luIG5hbWUgZm9yIGlkZW50aWZpY2F0aW9uLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBFeGVjdXRpb24gcHJpb3JpdHkg4oCTIGxvd2VyIHJ1bnMgZmlyc3QuIERlZmF1bHQgMC4gKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKiBDYWxsZWQgd2hlbiB0aGUgZW5naW5lIGluaXRpYWxpemVzLiAqL1xuICBvbkluaXQ/KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkO1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIGVuZ2luZSBpcyBkZXN0cm95ZWQuICovXG4gIG9uRGVzdHJveT8oKTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgZWFjaCByZW5kZXIgY3ljbGUuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlUmVuZGVyPygpOiBib29sZWFuO1xuICAvKiogQ2FsbGVkIGFmdGVyIGVhY2ggcmVuZGVyIGN5Y2xlLiAqL1xuICBvbkFmdGVyUmVuZGVyPygpOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBhIGNlbGwgZWRpdCBiZWdpbnMuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlRWRpdD8ocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZyk6IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBjZWxsIGVkaXQgY29tcGxldGVzLiAqL1xuICBvbkFmdGVyRWRpdD8ocm93SW5kZXg6IG51bWJlciwgY29sSWQ6IHN0cmluZywgb2xkVmFsdWU6IHVua25vd24sIG5ld1ZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSBzb3J0IG9wZXJhdGlvbi4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVTb3J0Pyhjb2xJZDogc3RyaW5nLCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgbnVsbCk6IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBzb3J0IG9wZXJhdGlvbi4gKi9cbiAgb25BZnRlclNvcnQ/KCk6IHZvaWQ7XG4gIC8qKiBDYWxsZWQgYmVmb3JlIGEgZmlsdGVyIG9wZXJhdGlvbi4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVGaWx0ZXI/KCk6IGJvb2xlYW47XG4gIC8qKiBDYWxsZWQgYWZ0ZXIgYSBmaWx0ZXIgb3BlcmF0aW9uLiAqL1xuICBvbkFmdGVyRmlsdGVyPygpOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSByb3dzIGFyZSBpbnNlcnRlZC4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVJbnNlcnRSb3dzPyhjb3VudDogbnVtYmVyLCBhdEluZGV4OiBudW1iZXIpOiBib29sZWFuO1xuICAvKiogQ2FsbGVkIGFmdGVyIHJvd3MgYXJlIGluc2VydGVkLiAqL1xuICBvbkFmdGVySW5zZXJ0Um93cz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSByb3dzIGFyZSBkZWxldGVkLiBSZXR1cm4gZmFsc2UgdG8gY2FuY2VsLiAqL1xuICBvbkJlZm9yZURlbGV0ZVJvd3M/KGluZGljZXM6IG51bWJlcltdKTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciByb3dzIGFyZSBkZWxldGVkLiAqL1xuICBvbkFmdGVyRGVsZXRlUm93cz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBjb2x1bW5zIGFyZSBpbnNlcnRlZC4gUmV0dXJuIGZhbHNlIHRvIGNhbmNlbC4gKi9cbiAgb25CZWZvcmVJbnNlcnRDb2x1bW5zPyhjb3VudDogbnVtYmVyLCBhdEluZGV4OiBudW1iZXIpOiBib29sZWFuO1xuICAvKiogQ2FsbGVkIGFmdGVyIGNvbHVtbnMgYXJlIGluc2VydGVkLiAqL1xuICBvbkFmdGVySW5zZXJ0Q29sdW1ucz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBjb2x1bW5zIGFyZSBkZWxldGVkLiBSZXR1cm4gZmFsc2UgdG8gY2FuY2VsLiAqL1xuICBvbkJlZm9yZURlbGV0ZUNvbHVtbnM/KGluZGljZXM6IG51bWJlcltdKTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciBjb2x1bW5zIGFyZSBkZWxldGVkLiAqL1xuICBvbkFmdGVyRGVsZXRlQ29sdW1ucz8oaW5kaWNlczogbnVtYmVyW10pOiB2b2lkO1xuICAvKiogQ2FsbGVkIGJlZm9yZSBjbGlwYm9hcmQgcGFzdGUuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlUGFzdGU/KGRhdGE6IHN0cmluZywgc3RhcnRDZWxsOiB7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9KTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciBjbGlwYm9hcmQgcGFzdGUuICovXG4gIG9uQWZ0ZXJQYXN0ZT8oKTogdm9pZDtcbiAgLyoqIENhbGxlZCBiZWZvcmUgY2xpcGJvYXJkIGNvcHkuIFJldHVybiBmYWxzZSB0byBjYW5jZWwuICovXG4gIG9uQmVmb3JlQ29weT8oKTogYm9vbGVhbjtcbiAgLyoqIENhbGxlZCBhZnRlciBjbGlwYm9hcmQgY29weS4gKi9cbiAgb25BZnRlckNvcHk/KCk6IHZvaWQ7XG4gIC8qKiBDdXN0b20gZXZlbnQgaGFuZGxlciBmb3IgYXJiaXRyYXJ5IHNwcmVhZHNoZWV0IGV2ZW50cy4gKi9cbiAgb25FdmVudD8oZXZlbnRUeXBlOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkO1xufVxuIl19
@@ -0,0 +1,114 @@
1
+ /**
2
+ * SelectionPlugin manages cell/row/column/range selection state.
3
+ * Handles keyboard navigation and selection extension.
4
+ */
5
+ export class SelectionPlugin {
6
+ constructor() {
7
+ this.name = 'selection';
8
+ this.priority = 5;
9
+ this._engine = null;
10
+ }
11
+ onInit(engine) {
12
+ this._engine = engine;
13
+ }
14
+ /** Select a single cell. */
15
+ selectCell(row, col) {
16
+ if (!this._engine)
17
+ return;
18
+ this._engine.selection.set({
19
+ ...this._engine.selection(),
20
+ activeCell: { row, col },
21
+ range: { start: { row, col }, end: { row, col } },
22
+ mode: 'cell',
23
+ });
24
+ }
25
+ /** Select a rectangular range. */
26
+ selectRange(start, end) {
27
+ if (!this._engine)
28
+ return;
29
+ this._engine.selection.set({
30
+ ...this._engine.selection(),
31
+ range: { start, end },
32
+ mode: 'range',
33
+ });
34
+ }
35
+ /** Select an entire row. */
36
+ selectRow(rowIndex) {
37
+ if (!this._engine)
38
+ return;
39
+ const rows = new Set(this._engine.selection().selectedRows);
40
+ if (rows.has(rowIndex)) {
41
+ rows.delete(rowIndex);
42
+ }
43
+ else {
44
+ rows.add(rowIndex);
45
+ }
46
+ this._engine.selection.set({
47
+ ...this._engine.selection(),
48
+ selectedRows: rows,
49
+ mode: 'row',
50
+ });
51
+ }
52
+ /** Select an entire column. */
53
+ selectColumn(colIndex) {
54
+ if (!this._engine)
55
+ return;
56
+ const cols = new Set(this._engine.selection().selectedCols);
57
+ if (cols.has(colIndex)) {
58
+ cols.delete(colIndex);
59
+ }
60
+ else {
61
+ cols.add(colIndex);
62
+ }
63
+ this._engine.selection.set({
64
+ ...this._engine.selection(),
65
+ selectedCols: cols,
66
+ mode: 'column',
67
+ });
68
+ }
69
+ /** Extend the range selection to include the given cell. */
70
+ extendSelection(row, col) {
71
+ if (!this._engine)
72
+ return;
73
+ const sel = this._engine.selection();
74
+ if (!sel.range) {
75
+ this.selectRange(sel.activeCell ?? { row, col }, { row, col });
76
+ }
77
+ else {
78
+ this.selectRange(sel.range.start, { row, col });
79
+ }
80
+ }
81
+ /** Clear all selection. */
82
+ clearSelection() {
83
+ if (!this._engine)
84
+ return;
85
+ this._engine.selection.set({
86
+ activeCell: null,
87
+ range: null,
88
+ selectedRows: new Set(),
89
+ selectedCols: new Set(),
90
+ mode: 'cell',
91
+ dragging: false,
92
+ });
93
+ }
94
+ /** Check if a cell is within the current selection. */
95
+ isSelected(row, col) {
96
+ const sel = this._engine?.selection();
97
+ if (!sel)
98
+ return false;
99
+ if (sel.range) {
100
+ const minRow = Math.min(sel.range.start.row, sel.range.end.row);
101
+ const maxRow = Math.max(sel.range.start.row, sel.range.end.row);
102
+ const minCol = Math.min(sel.range.start.col, sel.range.end.col);
103
+ const maxCol = Math.max(sel.range.start.col, sel.range.end.col);
104
+ if (row >= minRow && row <= maxRow && col >= minCol && col <= maxCol)
105
+ return true;
106
+ }
107
+ if (sel.selectedRows.has(row))
108
+ return true;
109
+ if (sel.selectedCols.has(col))
110
+ return true;
111
+ return false;
112
+ }
113
+ }
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zcHJlYWRzaGVldC9wbHVnaW4vc2VsZWN0aW9uLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUE1QjtRQUNXLFNBQUksR0FBRyxXQUFXLENBQUM7UUFDbkIsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUVkLFlBQU8sR0FBNkIsSUFBSSxDQUFDO0lBcUduRCxDQUFDO0lBbkdDLE1BQU0sQ0FBQyxNQUF5QjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLFVBQVUsQ0FBQyxHQUFXLEVBQUUsR0FBVztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUN6QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzNCLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqRCxJQUFJLEVBQUUsTUFBTTtTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsV0FBVyxDQUFDLEtBQWtCLEVBQUUsR0FBZ0I7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDekIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUMzQixL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RyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFdkIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxJQUFJLEdBQUcsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3BGLENBQUM7UUFFRCxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNDLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFM0MsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNwcmVhZHNoZWV0UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4udHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldEVuZ2luZSB9IGZyb20gJy4uL3NwcmVhZHNoZWV0LWVuZ2luZSc7XG5pbXBvcnQgdHlwZSB7IENlbGxBZGRyZXNzIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqXG4gKiBTZWxlY3Rpb25QbHVnaW4gbWFuYWdlcyBjZWxsL3Jvdy9jb2x1bW4vcmFuZ2Ugc2VsZWN0aW9uIHN0YXRlLlxuICogSGFuZGxlcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBzZWxlY3Rpb24gZXh0ZW5zaW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uUGx1Z2luIGltcGxlbWVudHMgU3ByZWFkc2hlZXRQbHVnaW4ge1xuICByZWFkb25seSBuYW1lID0gJ3NlbGVjdGlvbic7XG4gIHJlYWRvbmx5IHByaW9yaXR5ID0gNTtcblxuICBwcml2YXRlIF9lbmdpbmU6IFNwcmVhZHNoZWV0RW5naW5lIHwgbnVsbCA9IG51bGw7XG5cbiAgb25Jbml0KGVuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmdpbmUgPSBlbmdpbmU7XG4gIH1cblxuICAvKiogU2VsZWN0IGEgc2luZ2xlIGNlbGwuICovXG4gIHNlbGVjdENlbGwocm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcbiAgICB0aGlzLl9lbmdpbmUuc2VsZWN0aW9uLnNldCh7XG4gICAgICAuLi50aGlzLl9lbmdpbmUuc2VsZWN0aW9uKCksXG4gICAgICBhY3RpdmVDZWxsOiB7IHJvdywgY29sIH0sXG4gICAgICByYW5nZTogeyBzdGFydDogeyByb3csIGNvbCB9LCBlbmQ6IHsgcm93LCBjb2wgfSB9LFxuICAgICAgbW9kZTogJ2NlbGwnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbGVjdCBhIHJlY3Rhbmd1bGFyIHJhbmdlLiAqL1xuICBzZWxlY3RSYW5nZShzdGFydDogQ2VsbEFkZHJlc3MsIGVuZDogQ2VsbEFkZHJlc3MpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VuZ2luZSkgcmV0dXJuO1xuICAgIHRoaXMuX2VuZ2luZS5zZWxlY3Rpb24uc2V0KHtcbiAgICAgIC4uLnRoaXMuX2VuZ2luZS5zZWxlY3Rpb24oKSxcbiAgICAgIHJhbmdlOiB7IHN0YXJ0LCBlbmQgfSxcbiAgICAgIG1vZGU6ICdyYW5nZScsXG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VsZWN0IGFuIGVudGlyZSByb3cuICovXG4gIHNlbGVjdFJvdyhyb3dJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gbmV3IFNldCh0aGlzLl9lbmdpbmUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRSb3dzKTtcbiAgICBpZiAocm93cy5oYXMocm93SW5kZXgpKSB7XG4gICAgICByb3dzLmRlbGV0ZShyb3dJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvd3MuYWRkKHJvd0luZGV4KTtcbiAgICB9XG4gICAgdGhpcy5fZW5naW5lLnNlbGVjdGlvbi5zZXQoe1xuICAgICAgLi4udGhpcy5fZW5naW5lLnNlbGVjdGlvbigpLFxuICAgICAgc2VsZWN0ZWRSb3dzOiByb3dzLFxuICAgICAgbW9kZTogJ3JvdycsXG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VsZWN0IGFuIGVudGlyZSBjb2x1bW4uICovXG4gIHNlbGVjdENvbHVtbihjb2xJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcbiAgICBjb25zdCBjb2xzID0gbmV3IFNldCh0aGlzLl9lbmdpbmUuc2VsZWN0aW9uKCkuc2VsZWN0ZWRDb2xzKTtcbiAgICBpZiAoY29scy5oYXMoY29sSW5kZXgpKSB7XG4gICAgICBjb2xzLmRlbGV0ZShjb2xJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHMuYWRkKGNvbEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5fZW5naW5lLnNlbGVjdGlvbi5zZXQoe1xuICAgICAgLi4udGhpcy5fZW5naW5lLnNlbGVjdGlvbigpLFxuICAgICAgc2VsZWN0ZWRDb2xzOiBjb2xzLFxuICAgICAgbW9kZTogJ2NvbHVtbicsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRXh0ZW5kIHRoZSByYW5nZSBzZWxlY3Rpb24gdG8gaW5jbHVkZSB0aGUgZ2l2ZW4gY2VsbC4gKi9cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm47XG4gICAgY29uc3Qgc2VsID0gdGhpcy5fZW5naW5lLnNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsLnJhbmdlKSB7XG4gICAgICB0aGlzLnNlbGVjdFJhbmdlKHNlbC5hY3RpdmVDZWxsID8/IHsgcm93LCBjb2wgfSwgeyByb3csIGNvbCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RSYW5nZShzZWwucmFuZ2Uuc3RhcnQsIHsgcm93LCBjb2wgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzZWxlY3Rpb24uICovXG4gIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm47XG4gICAgdGhpcy5fZW5naW5lLnNlbGVjdGlvbi5zZXQoe1xuICAgICAgYWN0aXZlQ2VsbDogbnVsbCxcbiAgICAgIHJhbmdlOiBudWxsLFxuICAgICAgc2VsZWN0ZWRSb3dzOiBuZXcgU2V0KCksXG4gICAgICBzZWxlY3RlZENvbHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6ICdjZWxsJyxcbiAgICAgIGRyYWdnaW5nOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiBhIGNlbGwgaXMgd2l0aGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gKi9cbiAgaXNTZWxlY3RlZChyb3c6IG51bWJlciwgY29sOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLl9lbmdpbmU/LnNlbGVjdGlvbigpO1xuICAgIGlmICghc2VsKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoc2VsLnJhbmdlKSB7XG4gICAgICBjb25zdCBtaW5Sb3cgPSBNYXRoLm1pbihzZWwucmFuZ2Uuc3RhcnQucm93LCBzZWwucmFuZ2UuZW5kLnJvdyk7XG4gICAgICBjb25zdCBtYXhSb3cgPSBNYXRoLm1heChzZWwucmFuZ2Uuc3RhcnQucm93LCBzZWwucmFuZ2UuZW5kLnJvdyk7XG4gICAgICBjb25zdCBtaW5Db2wgPSBNYXRoLm1pbihzZWwucmFuZ2Uuc3RhcnQuY29sLCBzZWwucmFuZ2UuZW5kLmNvbCk7XG4gICAgICBjb25zdCBtYXhDb2wgPSBNYXRoLm1heChzZWwucmFuZ2Uuc3RhcnQuY29sLCBzZWwucmFuZ2UuZW5kLmNvbCk7XG4gICAgICBpZiAocm93ID49IG1pblJvdyAmJiByb3cgPD0gbWF4Um93ICYmIGNvbCA+PSBtaW5Db2wgJiYgY29sIDw9IG1heENvbCkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNlbC5zZWxlY3RlZFJvd3MuaGFzKHJvdykpIHJldHVybiB0cnVlO1xuICAgIGlmIChzZWwuc2VsZWN0ZWRDb2xzLmhhcyhjb2wpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
@@ -0,0 +1,63 @@
1
+ /**
2
+ * SortPlugin manages multi-column sorting.
3
+ * Sorts the engine's rows by the active sort criteria.
4
+ */
5
+ export class SortPlugin {
6
+ constructor() {
7
+ this.name = 'sort';
8
+ this.priority = 10;
9
+ this._engine = null;
10
+ }
11
+ onInit(engine) {
12
+ this._engine = engine;
13
+ }
14
+ /** Apply all active sort criteria to the engine's row list. */
15
+ applySort(criteria) {
16
+ if (!this._engine || criteria.length === 0)
17
+ return;
18
+ const defs = this._engine.columnDefs();
19
+ const sorted = [...this._engine.rowData()];
20
+ sorted.sort((a, b) => {
21
+ for (const crit of criteria) {
22
+ const col = defs.find((d) => d.id === crit.colId);
23
+ const aVal = a.cells[crit.colId]?.value;
24
+ const bVal = b.cells[crit.colId]?.value;
25
+ let cmp;
26
+ if (col?.comparator) {
27
+ cmp = col.comparator(aVal, bVal, crit.direction);
28
+ }
29
+ else {
30
+ cmp = defaultCompare(aVal, bVal);
31
+ }
32
+ if (cmp !== 0) {
33
+ return crit.direction === 'desc' ? -cmp : cmp;
34
+ }
35
+ }
36
+ return 0;
37
+ });
38
+ this._engine.rowData.set(sorted);
39
+ }
40
+ onBeforeSort(_colId, _direction) {
41
+ return true;
42
+ }
43
+ onAfterSort() {
44
+ const criteria = this._engine?.sortState().criteria;
45
+ if (criteria && criteria.length > 0) {
46
+ this.applySort(criteria);
47
+ }
48
+ }
49
+ }
50
+ function defaultCompare(a, b) {
51
+ if (a == null && b == null)
52
+ return 0;
53
+ if (a == null)
54
+ return -1;
55
+ if (b == null)
56
+ return 1;
57
+ if (typeof a === 'number' && typeof b === 'number')
58
+ return a - b;
59
+ if (a instanceof Date && b instanceof Date)
60
+ return a.getTime() - b.getTime();
61
+ return String(a).localeCompare(String(b));
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL3NvcnQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQXZCO1FBQ1csU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFZixZQUFPLEdBQTZCLElBQUksQ0FBQztJQThDbkQsQ0FBQztJQTVDQyxNQUFNLENBQUMsTUFBeUI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQUVELCtEQUErRDtJQUMvRCxTQUFTLENBQUMsUUFBa0M7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVuRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDO2dCQUN4QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUM7Z0JBRXhDLElBQUksR0FBVyxDQUFDO2dCQUNoQixJQUFJLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7cUJBQU0sQ0FBQztvQkFDTixHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkMsQ0FBQztnQkFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFjLEVBQUUsVUFBaUM7UUFDNUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsV0FBVztRQUNULE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsU0FBUyxjQUFjLENBQUMsQ0FBVSxFQUFFLENBQVU7SUFDNUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLElBQUksSUFBSTtRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJO1FBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzdFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldFBsdWdpbiB9IGZyb20gJy4vcGx1Z2luLnR5cGVzJztcbmltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRFbmdpbmUgfSBmcm9tICcuLi9zcHJlYWRzaGVldC1lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBTb3J0Q3JpdGVyaW9uIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuLyoqXG4gKiBTb3J0UGx1Z2luIG1hbmFnZXMgbXVsdGktY29sdW1uIHNvcnRpbmcuXG4gKiBTb3J0cyB0aGUgZW5naW5lJ3Mgcm93cyBieSB0aGUgYWN0aXZlIHNvcnQgY3JpdGVyaWEuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3J0UGx1Z2luIGltcGxlbWVudHMgU3ByZWFkc2hlZXRQbHVnaW4ge1xuICByZWFkb25seSBuYW1lID0gJ3NvcnQnO1xuICByZWFkb25seSBwcmlvcml0eSA9IDEwO1xuXG4gIHByaXZhdGUgX2VuZ2luZTogU3ByZWFkc2hlZXRFbmdpbmUgfCBudWxsID0gbnVsbDtcblxuICBvbkluaXQoZW5naW5lOiBTcHJlYWRzaGVldEVuZ2luZSk6IHZvaWQge1xuICAgIHRoaXMuX2VuZ2luZSA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhbGwgYWN0aXZlIHNvcnQgY3JpdGVyaWEgdG8gdGhlIGVuZ2luZSdzIHJvdyBsaXN0LiAqL1xuICBhcHBseVNvcnQoY3JpdGVyaWE6IHJlYWRvbmx5IFNvcnRDcml0ZXJpb25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lIHx8IGNyaXRlcmlhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGVmcyA9IHRoaXMuX2VuZ2luZS5jb2x1bW5EZWZzKCk7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuX2VuZ2luZS5yb3dEYXRhKCldO1xuXG4gICAgc29ydGVkLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY3JpdCBvZiBjcml0ZXJpYSkge1xuICAgICAgICBjb25zdCBjb2wgPSBkZWZzLmZpbmQoKGQpID0+IGQuaWQgPT09IGNyaXQuY29sSWQpO1xuICAgICAgICBjb25zdCBhVmFsID0gYS5jZWxsc1tjcml0LmNvbElkXT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGJWYWwgPSBiLmNlbGxzW2NyaXQuY29sSWRdPy52YWx1ZTtcblxuICAgICAgICBsZXQgY21wOiBudW1iZXI7XG4gICAgICAgIGlmIChjb2w/LmNvbXBhcmF0b3IpIHtcbiAgICAgICAgICBjbXAgPSBjb2wuY29tcGFyYXRvcihhVmFsLCBiVmFsLCBjcml0LmRpcmVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY21wID0gZGVmYXVsdENvbXBhcmUoYVZhbCwgYlZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGNyaXQuZGlyZWN0aW9uID09PSAnZGVzYycgPyAtY21wIDogY21wO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChzb3J0ZWQpO1xuICB9XG5cbiAgb25CZWZvcmVTb3J0KF9jb2xJZDogc3RyaW5nLCBfZGlyZWN0aW9uOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uQWZ0ZXJTb3J0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNyaXRlcmlhID0gdGhpcy5fZW5naW5lPy5zb3J0U3RhdGUoKS5jcml0ZXJpYTtcbiAgICBpZiAoY3JpdGVyaWEgJiYgY3JpdGVyaWEubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hcHBseVNvcnQoY3JpdGVyaWEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhOiB1bmtub3duLCBiOiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpIHJldHVybiAwO1xuICBpZiAoYSA9PSBudWxsKSByZXR1cm4gLTE7XG4gIGlmIChiID09IG51bGwpIHJldHVybiAxO1xuICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInICYmIHR5cGVvZiBiID09PSAnbnVtYmVyJykgcmV0dXJuIGEgLSBiO1xuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpO1xuICByZXR1cm4gU3RyaW5nKGEpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIpKTtcbn1cbiJdfQ==
@@ -0,0 +1,138 @@
1
+ /**
2
+ * UndoPlugin provides undo/redo by maintaining a history stack.
3
+ * Captures snapshots before mutations.
4
+ */
5
+ export class UndoPlugin {
6
+ constructor() {
7
+ this.name = 'undo';
8
+ this.priority = 100;
9
+ this._engine = null;
10
+ this._undoStack = [];
11
+ this._redoStack = [];
12
+ this._maxHistory = 100;
13
+ }
14
+ onInit(engine) {
15
+ this._engine = engine;
16
+ }
17
+ onDestroy() {
18
+ this._undoStack = [];
19
+ this._redoStack = [];
20
+ }
21
+ /** Record an edit mutation for undo. */
22
+ recordEdit(rowIndex, colId, oldValue, newValue) {
23
+ this._push({
24
+ type: 'edit',
25
+ timestamp: Date.now(),
26
+ edits: [{ rowIndex, colId, oldValue, newValue }],
27
+ });
28
+ }
29
+ /** Record a bulk edit (multiple cells). */
30
+ recordBulkEdit(edits) {
31
+ if (edits.length === 0)
32
+ return;
33
+ this._push({ type: 'edit', timestamp: Date.now(), edits });
34
+ }
35
+ /** Undo the last mutation. */
36
+ undo() {
37
+ if (!this._engine || this._undoStack.length === 0)
38
+ return false;
39
+ const entry = this._undoStack.pop();
40
+ this._applyUndo(entry);
41
+ this._redoStack.push(entry);
42
+ return true;
43
+ }
44
+ /** Redo the last undone mutation. */
45
+ redo() {
46
+ if (!this._engine || this._redoStack.length === 0)
47
+ return false;
48
+ const entry = this._redoStack.pop();
49
+ this._applyRedo(entry);
50
+ this._undoStack.push(entry);
51
+ return true;
52
+ }
53
+ /** Whether undo is available. */
54
+ get canUndo() {
55
+ return this._undoStack.length > 0;
56
+ }
57
+ /** Whether redo is available. */
58
+ get canRedo() {
59
+ return this._redoStack.length > 0;
60
+ }
61
+ /** Clear all history. */
62
+ clearHistory() {
63
+ this._undoStack = [];
64
+ this._redoStack = [];
65
+ }
66
+ _push(entry) {
67
+ this._undoStack.push(entry);
68
+ if (this._undoStack.length > this._maxHistory) {
69
+ this._undoStack.shift();
70
+ }
71
+ this._redoStack = [];
72
+ }
73
+ _applyUndo(entry) {
74
+ if (!this._engine)
75
+ return;
76
+ if (entry.type === 'edit' && entry.edits) {
77
+ const rows = [...this._engine.rowData()];
78
+ for (const edit of entry.edits) {
79
+ if (rows[edit.rowIndex]) {
80
+ rows[edit.rowIndex] = {
81
+ ...rows[edit.rowIndex],
82
+ cells: {
83
+ ...rows[edit.rowIndex].cells,
84
+ [edit.colId]: {
85
+ value: edit.oldValue,
86
+ meta: rows[edit.rowIndex].cells[edit.colId]?.meta,
87
+ },
88
+ },
89
+ };
90
+ }
91
+ }
92
+ this._engine.rowData.set(rows);
93
+ }
94
+ else if (entry.type === 'delete_rows' && entry.rows) {
95
+ const rows = [...this._engine.rowData()];
96
+ rows.splice(entry.rowIndex ?? 0, 0, ...entry.rows);
97
+ this._engine.rowData.set(rows);
98
+ }
99
+ else if (entry.type === 'insert_rows' && entry.rowIndex != null) {
100
+ const rows = [...this._engine.rowData()];
101
+ rows.splice(entry.rowIndex, entry.rows?.length ?? 0);
102
+ this._engine.rowData.set(rows);
103
+ }
104
+ }
105
+ _applyRedo(entry) {
106
+ if (!this._engine)
107
+ return;
108
+ if (entry.type === 'edit' && entry.edits) {
109
+ const rows = [...this._engine.rowData()];
110
+ for (const edit of entry.edits) {
111
+ if (rows[edit.rowIndex]) {
112
+ rows[edit.rowIndex] = {
113
+ ...rows[edit.rowIndex],
114
+ cells: {
115
+ ...rows[edit.rowIndex].cells,
116
+ [edit.colId]: {
117
+ value: edit.newValue,
118
+ meta: rows[edit.rowIndex].cells[edit.colId]?.meta,
119
+ },
120
+ },
121
+ };
122
+ }
123
+ }
124
+ this._engine.rowData.set(rows);
125
+ }
126
+ else if (entry.type === 'insert_rows' && entry.rows) {
127
+ const rows = [...this._engine.rowData()];
128
+ rows.splice(entry.rowIndex ?? 0, 0, ...entry.rows);
129
+ this._engine.rowData.set(rows);
130
+ }
131
+ else if (entry.type === 'delete_rows' && entry.rowIndex != null) {
132
+ const rows = [...this._engine.rowData()];
133
+ rows.splice(entry.rowIndex, entry.rows?.length ?? 0);
134
+ this._engine.rowData.set(rows);
135
+ }
136
+ }
137
+ }
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kby1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc3ByZWFkc2hlZXQvcGx1Z2luL3VuZG8tcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdCQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUF2QjtRQUNXLFNBQUksR0FBRyxNQUFNLENBQUM7UUFDZCxhQUFRLEdBQUcsR0FBRyxDQUFDO1FBRWhCLFlBQU8sR0FBNkIsSUFBSSxDQUFDO1FBQ3pDLGVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQzdCLGVBQVUsR0FBZ0IsRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQUcsR0FBRyxDQUFDO0lBbUk1QixDQUFDO0lBaklDLE1BQU0sQ0FBQyxNQUF5QjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsS0FBYSxFQUFFLFFBQW1CLEVBQUUsUUFBbUI7UUFDbEYsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNULElBQUksRUFBRSxNQUFNO1lBQ1osU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLGNBQWMsQ0FDWixLQUFzRjtRQUV0RixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUs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LENBQUMsUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcHJlYWRzaGVldFBsdWdpbiB9IGZyb20gJy4vcGx1Z2luLnR5cGVzJztcbmltcG9ydCB0eXBlIHsgU3ByZWFkc2hlZXRFbmdpbmUgfSBmcm9tICcuLi9zcHJlYWRzaGVldC1lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBDZWxsVmFsdWUsIFJvd0RlZiB9IGZyb20gJy4uL21vZGVscyc7XG5cbmludGVyZmFjZSBVbmRvRW50cnkge1xuICByZWFkb25seSB0eXBlOiAnZWRpdCcgfCAnaW5zZXJ0X3Jvd3MnIHwgJ2RlbGV0ZV9yb3dzJyB8ICdpbnNlcnRfY29scycgfCAnZGVsZXRlX2NvbHMnO1xuICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlcjtcbiAgLyoqIEZvciBlZGl0OiByb3cgaW5kZXggKyBjb2wgaWQgKyBvbGQgdmFsdWUuICovXG4gIHJlYWRvbmx5IGVkaXRzPzogeyByb3dJbmRleDogbnVtYmVyOyBjb2xJZDogc3RyaW5nOyBvbGRWYWx1ZTogQ2VsbFZhbHVlOyBuZXdWYWx1ZTogQ2VsbFZhbHVlIH1bXTtcbiAgLyoqIEZvciByb3cvY29sIGluc2VydC9kZWxldGU6IHRoZSBhY3R1YWwgZGF0YSB0aGF0IHdhcyByZW1vdmVkIG9yIGFkZGVkLiAqL1xuICByZWFkb25seSByb3dzPzogUm93RGVmW107XG4gIHJlYWRvbmx5IHJvd0luZGV4PzogbnVtYmVyO1xuICByZWFkb25seSBjb2xJZHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY29sV2lkdGhzPzogbnVtYmVyW107XG59XG5cbi8qKlxuICogVW5kb1BsdWdpbiBwcm92aWRlcyB1bmRvL3JlZG8gYnkgbWFpbnRhaW5pbmcgYSBoaXN0b3J5IHN0YWNrLlxuICogQ2FwdHVyZXMgc25hcHNob3RzIGJlZm9yZSBtdXRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRvUGx1Z2luIGltcGxlbWVudHMgU3ByZWFkc2hlZXRQbHVnaW4ge1xuICByZWFkb25seSBuYW1lID0gJ3VuZG8nO1xuICByZWFkb25seSBwcmlvcml0eSA9IDEwMDtcblxuICBwcml2YXRlIF9lbmdpbmU6IFNwcmVhZHNoZWV0RW5naW5lIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3VuZG9TdGFjazogVW5kb0VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBfcmVkb1N0YWNrOiBVbmRvRW50cnlbXSA9IFtdO1xuICBwcml2YXRlIF9tYXhIaXN0b3J5ID0gMTAwO1xuXG4gIG9uSW5pdChlbmdpbmU6IFNwcmVhZHNoZWV0RW5naW5lKTogdm9pZCB7XG4gICAgdGhpcy5fZW5naW5lID0gZW5naW5lO1xuICB9XG5cbiAgb25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3VuZG9TdGFjayA9IFtdO1xuICAgIHRoaXMuX3JlZG9TdGFjayA9IFtdO1xuICB9XG5cbiAgLyoqIFJlY29yZCBhbiBlZGl0IG11dGF0aW9uIGZvciB1bmRvLiAqL1xuICByZWNvcmRFZGl0KHJvd0luZGV4OiBudW1iZXIsIGNvbElkOiBzdHJpbmcsIG9sZFZhbHVlOiBDZWxsVmFsdWUsIG5ld1ZhbHVlOiBDZWxsVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLl9wdXNoKHtcbiAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGVkaXRzOiBbeyByb3dJbmRleCwgY29sSWQsIG9sZFZhbHVlLCBuZXdWYWx1ZSB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWNvcmQgYSBidWxrIGVkaXQgKG11bHRpcGxlIGNlbGxzKS4gKi9cbiAgcmVjb3JkQnVsa0VkaXQoXG4gICAgZWRpdHM6IHsgcm93SW5kZXg6IG51bWJlcjsgY29sSWQ6IHN0cmluZzsgb2xkVmFsdWU6IENlbGxWYWx1ZTsgbmV3VmFsdWU6IENlbGxWYWx1ZSB9W10sXG4gICk6IHZvaWQge1xuICAgIGlmIChlZGl0cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLl9wdXNoKHsgdHlwZTogJ2VkaXQnLCB0aW1lc3RhbXA6IERhdGUubm93KCksIGVkaXRzIH0pO1xuICB9XG5cbiAgLyoqIFVuZG8gdGhlIGxhc3QgbXV0YXRpb24uICovXG4gIHVuZG8oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUgfHwgdGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5fdW5kb1N0YWNrLnBvcCgpITtcbiAgICB0aGlzLl9hcHBseVVuZG8oZW50cnkpO1xuICAgIHRoaXMuX3JlZG9TdGFjay5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZWRvIHRoZSBsYXN0IHVuZG9uZSBtdXRhdGlvbi4gKi9cbiAgcmVkbygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuX2VuZ2luZSB8fCB0aGlzLl9yZWRvU3RhY2subGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9yZWRvU3RhY2sucG9wKCkhO1xuICAgIHRoaXMuX2FwcGx5UmVkbyhlbnRyeSk7XG4gICAgdGhpcy5fdW5kb1N0YWNrLnB1c2goZW50cnkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdW5kbyBpcyBhdmFpbGFibGUuICovXG4gIGdldCBjYW5VbmRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91bmRvU3RhY2subGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHJlZG8gaXMgYXZhaWxhYmxlLiAqL1xuICBnZXQgY2FuUmVkbygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkb1N0YWNrLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQ2xlYXIgYWxsIGhpc3RvcnkuICovXG4gIGNsZWFySGlzdG9yeSgpOiB2b2lkIHtcbiAgICB0aGlzLl91bmRvU3RhY2sgPSBbXTtcbiAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX3B1c2goZW50cnk6IFVuZG9FbnRyeSk6IHZvaWQge1xuICAgIHRoaXMuX3VuZG9TdGFjay5wdXNoKGVudHJ5KTtcbiAgICBpZiAodGhpcy5fdW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuX21heEhpc3RvcnkpIHtcbiAgICAgIHRoaXMuX3VuZG9TdGFjay5zaGlmdCgpO1xuICAgIH1cbiAgICB0aGlzLl9yZWRvU3RhY2sgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5VW5kbyhlbnRyeTogVW5kb0VudHJ5KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmdpbmUpIHJldHVybjtcblxuICAgIGlmIChlbnRyeS50eXBlID09PSAnZWRpdCcgJiYgZW50cnkuZWRpdHMpIHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5fZW5naW5lLnJvd0RhdGEoKV07XG4gICAgICBmb3IgKGNvbnN0IGVkaXQgb2YgZW50cnkuZWRpdHMpIHtcbiAgICAgICAgaWYgKHJvd3NbZWRpdC5yb3dJbmRleF0pIHtcbiAgICAgICAgICByb3dzW2VkaXQucm93SW5kZXhdID0ge1xuICAgICAgICAgICAgLi4ucm93c1tlZGl0LnJvd0luZGV4XSxcbiAgICAgICAgICAgIGNlbGxzOiB7XG4gICAgICAgICAgICAgIC4uLnJvd3NbZWRpdC5yb3dJbmRleF0uY2VsbHMsXG4gICAgICAgICAgICAgIFtlZGl0LmNvbElkXToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBlZGl0Lm9sZFZhbHVlLFxuICAgICAgICAgICAgICAgIG1ldGE6IHJvd3NbZWRpdC5yb3dJbmRleF0uY2VsbHNbZWRpdC5jb2xJZF0/Lm1ldGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChyb3dzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICdkZWxldGVfcm93cycgJiYgZW50cnkucm93cykge1xuICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLl9lbmdpbmUucm93RGF0YSgpXTtcbiAgICAgIHJvd3Muc3BsaWNlKGVudHJ5LnJvd0luZGV4ID8/IDAsIDAsIC4uLmVudHJ5LnJvd3MpO1xuICAgICAgdGhpcy5fZW5naW5lLnJvd0RhdGEuc2V0KHJvd3MpO1xuICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gJ2luc2VydF9yb3dzJyAmJiBlbnRyeS5yb3dJbmRleCAhPSBudWxsKSB7XG4gICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMuX2VuZ2luZS5yb3dEYXRhKCldO1xuICAgICAgcm93cy5zcGxpY2UoZW50cnkucm93SW5kZXgsIGVudHJ5LnJvd3M/Lmxlbmd0aCA/PyAwKTtcbiAgICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChyb3dzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVJlZG8oZW50cnk6IFVuZG9FbnRyeSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5naW5lKSByZXR1cm47XG5cbiAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2VkaXQnICYmIGVudHJ5LmVkaXRzKSB7XG4gICAgICBjb25zdCByb3dzID0gWy4uLnRoaXMuX2VuZ2luZS5yb3dEYXRhKCldO1xuICAgICAgZm9yIChjb25zdCBlZGl0IG9mIGVudHJ5LmVkaXRzKSB7XG4gICAgICAgIGlmIChyb3dzW2VkaXQucm93SW5kZXhdKSB7XG4gICAgICAgICAgcm93c1tlZGl0LnJvd0luZGV4XSA9IHtcbiAgICAgICAgICAgIC4uLnJvd3NbZWRpdC5yb3dJbmRleF0sXG4gICAgICAgICAgICBjZWxsczoge1xuICAgICAgICAgICAgICAuLi5yb3dzW2VkaXQucm93SW5kZXhdLmNlbGxzLFxuICAgICAgICAgICAgICBbZWRpdC5jb2xJZF06IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZWRpdC5uZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICBtZXRhOiByb3dzW2VkaXQucm93SW5kZXhdLmNlbGxzW2VkaXQuY29sSWRdPy5tZXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9lbmdpbmUucm93RGF0YS5zZXQocm93cyk7XG4gICAgfSBlbHNlIGlmIChlbnRyeS50eXBlID09PSAnaW5zZXJ0X3Jvd3MnICYmIGVudHJ5LnJvd3MpIHtcbiAgICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy5fZW5naW5lLnJvd0RhdGEoKV07XG4gICAgICByb3dzLnNwbGljZShlbnRyeS5yb3dJbmRleCA/PyAwLCAwLCAuLi5lbnRyeS5yb3dzKTtcbiAgICAgIHRoaXMuX2VuZ2luZS5yb3dEYXRhLnNldChyb3dzKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LnR5cGUgPT09ICdkZWxldGVfcm93cycgJiYgZW50cnkucm93SW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLl9lbmdpbmUucm93RGF0YSgpXTtcbiAgICAgIHJvd3Muc3BsaWNlKGVudHJ5LnJvd0luZGV4LCBlbnRyeS5yb3dzPy5sZW5ndGggPz8gMCk7XG4gICAgICB0aGlzLl9lbmdpbmUucm93RGF0YS5zZXQocm93cyk7XG4gICAgfVxuICB9XG59XG4iXX0=