@odoo/o-spreadsheet 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/.eslintrc.json +20 -0
  2. package/.husky/post-checkout +9 -0
  3. package/.husky/pre-commit +39 -0
  4. package/.prettierignore +1 -0
  5. package/astToFormula.patch +0 -0
  6. package/demo/data.js +255 -0
  7. package/demo/index.html +9 -0
  8. package/demo/libs/Chart.bundle.js +20755 -0
  9. package/demo/main.js +101 -0
  10. package/doc/readme.md +46 -0
  11. package/package.json +78 -0
  12. package/readme.md +39 -0
  13. package/rollup.config.js +23 -0
  14. package/src/base_plugin.ts +102 -0
  15. package/src/components/autofill.ts +146 -0
  16. package/src/components/bottom_bar.ts +199 -0
  17. package/src/components/color_picker.ts +150 -0
  18. package/src/components/composer/autocomplete_dropdown.ts +135 -0
  19. package/src/components/composer/composer.ts +487 -0
  20. package/src/components/composer/content_editable_helper.ts +146 -0
  21. package/src/components/figures/chart.ts +70 -0
  22. package/src/components/figures/container.ts +268 -0
  23. package/src/components/figures/text_figure.ts +36 -0
  24. package/src/components/grid.ts +635 -0
  25. package/src/components/helpers/dom_helpers.ts +7 -0
  26. package/src/components/helpers/drag_and_drop.ts +17 -0
  27. package/src/components/icons.ts +36 -0
  28. package/src/components/index.ts +1 -0
  29. package/src/components/menu.ts +288 -0
  30. package/src/components/overlay.ts +457 -0
  31. package/src/components/scrollbar.ts +22 -0
  32. package/src/components/selection_input.ts +168 -0
  33. package/src/components/side_panel/cell_is_rule_editor.ts +169 -0
  34. package/src/components/side_panel/chart_panel.ts +104 -0
  35. package/src/components/side_panel/color_scale_rule_editor.ts +145 -0
  36. package/src/components/side_panel/conditional_formatting.ts +396 -0
  37. package/src/components/side_panel/side_panel.ts +127 -0
  38. package/src/components/side_panel/translations_terms.ts +45 -0
  39. package/src/components/spreadsheet.ts +198 -0
  40. package/src/components/top_bar.ts +535 -0
  41. package/src/constants.ts +26 -0
  42. package/src/data.ts +149 -0
  43. package/src/fonts.ts +41 -0
  44. package/src/formulas/compiler.ts +258 -0
  45. package/src/formulas/composer_tokenizer.ts +70 -0
  46. package/src/formulas/index.ts +15 -0
  47. package/src/formulas/normalize.ts +52 -0
  48. package/src/formulas/parser.ts +280 -0
  49. package/src/formulas/range_tokenizer.ts +97 -0
  50. package/src/formulas/tokenizer.ts +242 -0
  51. package/src/functions/arguments.ts +114 -0
  52. package/src/functions/dates.ts +302 -0
  53. package/src/functions/helpers.ts +592 -0
  54. package/src/functions/index.ts +52 -0
  55. package/src/functions/module_database.ts +282 -0
  56. package/src/functions/module_date.ts +743 -0
  57. package/src/functions/module_info.ts +69 -0
  58. package/src/functions/module_logical.ts +208 -0
  59. package/src/functions/module_lookup.ts +185 -0
  60. package/src/functions/module_math.ts +1252 -0
  61. package/src/functions/module_operators.ts +291 -0
  62. package/src/functions/module_statistical.ts +882 -0
  63. package/src/functions/module_text.ts +370 -0
  64. package/src/helpers/color.ts +30 -0
  65. package/src/helpers/coordinates.ts +71 -0
  66. package/src/helpers/grid_manipulation.ts +68 -0
  67. package/src/helpers/index.ts +7 -0
  68. package/src/helpers/misc.ts +76 -0
  69. package/src/helpers/numbers.ts +117 -0
  70. package/src/helpers/uuid.ts +19 -0
  71. package/src/helpers/zones.ts +263 -0
  72. package/src/history.ts +186 -0
  73. package/src/index.ts +84 -0
  74. package/src/model.ts +261 -0
  75. package/src/plugins/autofill.ts +412 -0
  76. package/src/plugins/chart.ts +404 -0
  77. package/src/plugins/clipboard.ts +461 -0
  78. package/src/plugins/conditional_format.ts +445 -0
  79. package/src/plugins/core.ts +1502 -0
  80. package/src/plugins/edition.ts +157 -0
  81. package/src/plugins/evaluation.ts +428 -0
  82. package/src/plugins/figures.ts +123 -0
  83. package/src/plugins/formatting.ts +630 -0
  84. package/src/plugins/highlight.ts +187 -0
  85. package/src/plugins/index.ts +32 -0
  86. package/src/plugins/merge.ts +524 -0
  87. package/src/plugins/renderer.ts +571 -0
  88. package/src/plugins/selection.ts +562 -0
  89. package/src/plugins/selection_inputs.ts +326 -0
  90. package/src/registries/autofill_modifiers.ts +76 -0
  91. package/src/registries/autofill_rules.ts +98 -0
  92. package/src/registries/figure_registry.ts +30 -0
  93. package/src/registries/index.ts +7 -0
  94. package/src/registries/menu_items_registry.ts +110 -0
  95. package/src/registries/menus/cell_menu_registry.ts +79 -0
  96. package/src/registries/menus/col_menu_registry.ts +63 -0
  97. package/src/registries/menus/index.ts +6 -0
  98. package/src/registries/menus/menu_items_actions.ts +425 -0
  99. package/src/registries/menus/row_menu_registry.ts +63 -0
  100. package/src/registries/menus/sheet_menu_registry.ts +75 -0
  101. package/src/registries/menus/topbar_menu_registry.ts +204 -0
  102. package/src/registries/side_panel_registry.ts +26 -0
  103. package/src/registries/topbar_component_registry.ts +12 -0
  104. package/src/registry.ts +51 -0
  105. package/src/translation.ts +44 -0
  106. package/src/types/autofill.ts +48 -0
  107. package/src/types/chart.ts +26 -0
  108. package/src/types/commands.ts +716 -0
  109. package/src/types/conditional_formatting.ts +124 -0
  110. package/src/types/env.ts +13 -0
  111. package/src/types/functions.ts +35 -0
  112. package/src/types/getters.ts +103 -0
  113. package/src/types/index.ts +20 -0
  114. package/src/types/misc.ts +143 -0
  115. package/src/types/rendering.ts +41 -0
  116. package/src/types/workbook_data.ts +62 -0
  117. package/tests/__mocks__/uuid.ts +7 -0
  118. package/tests/canvas.mock.ts +34 -0
  119. package/tests/components/__mocks__/content_editable_helper.ts +79 -0
  120. package/tests/components/__mocks__/scrollbar.ts +18 -0
  121. package/tests/components/__snapshots__/autocomplete_dropdown_test.ts.snap +29 -0
  122. package/tests/components/__snapshots__/bottom_bar_test.ts.snap +75 -0
  123. package/tests/components/__snapshots__/context_menu_test.ts.snap +88 -0
  124. package/tests/components/__snapshots__/grid_test.ts.snap +60 -0
  125. package/tests/components/__snapshots__/spreadsheet_test.ts.snap +455 -0
  126. package/tests/components/__snapshots__/top_bar_test.ts.snap +705 -0
  127. package/tests/components/autocomplete_dropdown_test.ts +315 -0
  128. package/tests/components/autofill_test.ts +167 -0
  129. package/tests/components/bottom_bar_test.ts +262 -0
  130. package/tests/components/chart_side_panel_test.ts +123 -0
  131. package/tests/components/composer_test.ts +400 -0
  132. package/tests/components/context_menu_test.ts +825 -0
  133. package/tests/components/grid_manipulation_test.ts +163 -0
  134. package/tests/components/grid_test.ts +581 -0
  135. package/tests/components/overlay_test.ts +541 -0
  136. package/tests/components/selection_input_test.ts +259 -0
  137. package/tests/components/side_panel_test.ts +148 -0
  138. package/tests/components/spreadsheet_test.ts +194 -0
  139. package/tests/components/top_bar_test.ts +427 -0
  140. package/tests/data_test.ts +175 -0
  141. package/tests/dom_helper.ts +42 -0
  142. package/tests/formulas/__snapshots__/compiler_test.ts.snap +302 -0
  143. package/tests/formulas/compiler_test.ts +266 -0
  144. package/tests/formulas/composer_tokenizer_test.ts +137 -0
  145. package/tests/formulas/expressions_test.ts +57 -0
  146. package/tests/formulas/formulas_test.ts +80 -0
  147. package/tests/formulas/normalize_test.ts +82 -0
  148. package/tests/formulas/parser_test.ts +224 -0
  149. package/tests/formulas/range_tokenizer_test.ts +187 -0
  150. package/tests/formulas/tokenizer_test.ts +164 -0
  151. package/tests/functions/arguments_test.ts +141 -0
  152. package/tests/functions/dates_test.ts +1081 -0
  153. package/tests/functions/functions_test.ts +53 -0
  154. package/tests/functions/helper_test.ts +98 -0
  155. package/tests/functions/module_database_test.ts +311 -0
  156. package/tests/functions/module_date_test.ts +941 -0
  157. package/tests/functions/module_info_test.ts +139 -0
  158. package/tests/functions/module_logical_test.ts +369 -0
  159. package/tests/functions/module_lookup_test.ts +541 -0
  160. package/tests/functions/module_math_test.ts +2482 -0
  161. package/tests/functions/module_operators_test.ts +955 -0
  162. package/tests/functions/module_statistical_test.ts +2014 -0
  163. package/tests/functions/module_text_test.ts +667 -0
  164. package/tests/helpers/coordinates_test.ts +25 -0
  165. package/tests/helpers/misc_test.ts +95 -0
  166. package/tests/helpers/numbers_test.ts +196 -0
  167. package/tests/helpers/zones_test.ts +97 -0
  168. package/tests/helpers.ts +384 -0
  169. package/tests/menu_items_registry_test.ts +540 -0
  170. package/tests/model/plugins/__snapshots__/chart_test.ts.snap +90 -0
  171. package/tests/model/plugins/chart_test.ts +562 -0
  172. package/tests/model_test.ts +82 -0
  173. package/tests/plugins/__snapshots__/conditional_formatting_test.ts.snap +131 -0
  174. package/tests/plugins/__snapshots__/renderer_test.ts.snap +371 -0
  175. package/tests/plugins/autofill_test.ts +457 -0
  176. package/tests/plugins/borders_test.ts +295 -0
  177. package/tests/plugins/clipboard_test.ts +1180 -0
  178. package/tests/plugins/conditional_formatting_test.ts +1253 -0
  179. package/tests/plugins/core_test.ts +614 -0
  180. package/tests/plugins/edition_test.ts +100 -0
  181. package/tests/plugins/evaluation_async_test.ts +332 -0
  182. package/tests/plugins/evaluation_dates_test.ts +79 -0
  183. package/tests/plugins/evaluation_test.ts +901 -0
  184. package/tests/plugins/figures_test.ts +327 -0
  185. package/tests/plugins/formatting_test.ts +391 -0
  186. package/tests/plugins/grid_manipulation_test.ts +1366 -0
  187. package/tests/plugins/highlight_test.ts +413 -0
  188. package/tests/plugins/history_test.ts +142 -0
  189. package/tests/plugins/import_export_test.ts +276 -0
  190. package/tests/plugins/merges_test.ts +490 -0
  191. package/tests/plugins/navigation_test.ts +181 -0
  192. package/tests/plugins/plugins/evaluation_test.ts +111 -0
  193. package/tests/plugins/renderer_test.ts +598 -0
  194. package/tests/plugins/resizing_test.ts +152 -0
  195. package/tests/plugins/selection_input_test.ts +409 -0
  196. package/tests/plugins/selection_test.ts +442 -0
  197. package/tests/plugins/sheets_test.ts +643 -0
  198. package/tests/plugins/style_test.ts +90 -0
  199. package/tsconfig.json +22 -0
@@ -0,0 +1,131 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`UI of conditional formats simple snapshot 1`] = `
4
+ <div
5
+ class="o-sidePanel"
6
+ >
7
+ <div
8
+ class="o-sidePanelHeader"
9
+ >
10
+ <div
11
+ class="o-sidePanelTitle"
12
+ >
13
+ Conditional formatting
14
+ </div>
15
+ <div
16
+ class="o-sidePanelClose"
17
+ >
18
+ ×
19
+ </div>
20
+ </div>
21
+ <div
22
+ class="o-sidePanelBody"
23
+ >
24
+ <div
25
+ class="o-cf"
26
+ >
27
+ <div
28
+ class="o-cf-preview-list"
29
+ >
30
+ <div>
31
+ <div
32
+ class="o-cf-preview"
33
+ >
34
+ <div
35
+ class="o-cf-preview-image"
36
+ style="font-weight:normal;
37
+ text-decoration:none;
38
+ font-style:normal;
39
+ color:none;
40
+ background-color:#FF0000;"
41
+ >
42
+ 123
43
+ </div>
44
+ <div
45
+ class="o-cf-preview-description"
46
+ >
47
+ <div
48
+ class="o-cf-preview-ruletype"
49
+ >
50
+ <div
51
+ class="o-cf-preview-description-rule"
52
+ >
53
+ Is equal to
54
+ </div>
55
+ <div
56
+ class="o-cf-preview-description-values"
57
+ >
58
+ 2
59
+ </div>
60
+ </div>
61
+ <div
62
+ class="o-cf-preview-range"
63
+ >
64
+ A1:A2
65
+ </div>
66
+ </div>
67
+ <div
68
+ class="o-cf-delete"
69
+ >
70
+ <div
71
+ aria-label="Remove rule"
72
+ class="o-cf-delete-button"
73
+ >
74
+ x
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+ <div>
80
+ <div
81
+ class="o-cf-preview"
82
+ >
83
+ <div
84
+ class="o-cf-preview-image"
85
+ style="background-image: linear-gradient(to right, #ff00ff, #123456)"
86
+ >
87
+ 123
88
+ </div>
89
+ <div
90
+ class="o-cf-preview-description"
91
+ >
92
+ <div
93
+ class="o-cf-preview-ruletype"
94
+ >
95
+ <div
96
+ class="o-cf-preview-description-rule"
97
+ >
98
+ Color scale
99
+ </div>
100
+ <div
101
+ class="o-cf-preview-description-values"
102
+ />
103
+ </div>
104
+ <div
105
+ class="o-cf-preview-range"
106
+ >
107
+ B1:B5
108
+ </div>
109
+ </div>
110
+ <div
111
+ class="o-cf-delete"
112
+ >
113
+ <div
114
+ aria-label="Remove rule"
115
+ class="o-cf-delete-button"
116
+ >
117
+ x
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ <div
124
+ class="o-cf-add"
125
+ >
126
+ + Add another rule
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ `;
@@ -0,0 +1,371 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`renderer snapshot for a simple grid rendering 1`] = `
4
+ Array [
5
+ "context.fillStyle=\\"white\\";",
6
+ "context.fillRect(0, 0, 1000, 1000)",
7
+ "context.lineWidth=0.8;",
8
+ "context.strokeStyle=\\"#E2E3E3\\";",
9
+ "context.beginPath()",
10
+ "context.moveTo(144, 0)",
11
+ "context.lineTo(144, 1000)",
12
+ "context.moveTo(240, 0)",
13
+ "context.lineTo(240, 1000)",
14
+ "context.moveTo(336, 0)",
15
+ "context.lineTo(336, 1000)",
16
+ "context.moveTo(432, 0)",
17
+ "context.lineTo(432, 1000)",
18
+ "context.moveTo(528, 0)",
19
+ "context.lineTo(528, 1000)",
20
+ "context.moveTo(624, 0)",
21
+ "context.lineTo(624, 1000)",
22
+ "context.moveTo(720, 0)",
23
+ "context.lineTo(720, 1000)",
24
+ "context.moveTo(816, 0)",
25
+ "context.lineTo(816, 1000)",
26
+ "context.moveTo(912, 0)",
27
+ "context.lineTo(912, 1000)",
28
+ "context.moveTo(1008, 0)",
29
+ "context.lineTo(1008, 1000)",
30
+ "context.moveTo(0, 49)",
31
+ "context.lineTo(1000, 49)",
32
+ "context.moveTo(0, 72)",
33
+ "context.lineTo(1000, 72)",
34
+ "context.moveTo(0, 95)",
35
+ "context.lineTo(1000, 95)",
36
+ "context.moveTo(0, 118)",
37
+ "context.lineTo(1000, 118)",
38
+ "context.moveTo(0, 141)",
39
+ "context.lineTo(1000, 141)",
40
+ "context.moveTo(0, 164)",
41
+ "context.lineTo(1000, 164)",
42
+ "context.moveTo(0, 187)",
43
+ "context.lineTo(1000, 187)",
44
+ "context.moveTo(0, 210)",
45
+ "context.lineTo(1000, 210)",
46
+ "context.moveTo(0, 233)",
47
+ "context.lineTo(1000, 233)",
48
+ "context.moveTo(0, 256)",
49
+ "context.lineTo(1000, 256)",
50
+ "context.moveTo(0, 279)",
51
+ "context.lineTo(1000, 279)",
52
+ "context.moveTo(0, 302)",
53
+ "context.lineTo(1000, 302)",
54
+ "context.moveTo(0, 325)",
55
+ "context.lineTo(1000, 325)",
56
+ "context.moveTo(0, 348)",
57
+ "context.lineTo(1000, 348)",
58
+ "context.moveTo(0, 371)",
59
+ "context.lineTo(1000, 371)",
60
+ "context.moveTo(0, 394)",
61
+ "context.lineTo(1000, 394)",
62
+ "context.moveTo(0, 417)",
63
+ "context.lineTo(1000, 417)",
64
+ "context.moveTo(0, 440)",
65
+ "context.lineTo(1000, 440)",
66
+ "context.moveTo(0, 463)",
67
+ "context.lineTo(1000, 463)",
68
+ "context.moveTo(0, 486)",
69
+ "context.lineTo(1000, 486)",
70
+ "context.moveTo(0, 509)",
71
+ "context.lineTo(1000, 509)",
72
+ "context.moveTo(0, 532)",
73
+ "context.lineTo(1000, 532)",
74
+ "context.moveTo(0, 555)",
75
+ "context.lineTo(1000, 555)",
76
+ "context.moveTo(0, 578)",
77
+ "context.lineTo(1000, 578)",
78
+ "context.moveTo(0, 601)",
79
+ "context.lineTo(1000, 601)",
80
+ "context.moveTo(0, 624)",
81
+ "context.lineTo(1000, 624)",
82
+ "context.moveTo(0, 647)",
83
+ "context.lineTo(1000, 647)",
84
+ "context.moveTo(0, 670)",
85
+ "context.lineTo(1000, 670)",
86
+ "context.moveTo(0, 693)",
87
+ "context.lineTo(1000, 693)",
88
+ "context.moveTo(0, 716)",
89
+ "context.lineTo(1000, 716)",
90
+ "context.moveTo(0, 739)",
91
+ "context.lineTo(1000, 739)",
92
+ "context.moveTo(0, 762)",
93
+ "context.lineTo(1000, 762)",
94
+ "context.moveTo(0, 785)",
95
+ "context.lineTo(1000, 785)",
96
+ "context.moveTo(0, 808)",
97
+ "context.lineTo(1000, 808)",
98
+ "context.moveTo(0, 831)",
99
+ "context.lineTo(1000, 831)",
100
+ "context.moveTo(0, 854)",
101
+ "context.lineTo(1000, 854)",
102
+ "context.moveTo(0, 877)",
103
+ "context.lineTo(1000, 877)",
104
+ "context.moveTo(0, 900)",
105
+ "context.lineTo(1000, 900)",
106
+ "context.moveTo(0, 923)",
107
+ "context.lineTo(1000, 923)",
108
+ "context.moveTo(0, 946)",
109
+ "context.lineTo(1000, 946)",
110
+ "context.moveTo(0, 969)",
111
+ "context.lineTo(1000, 969)",
112
+ "context.moveTo(0, 992)",
113
+ "context.lineTo(1000, 992)",
114
+ "context.moveTo(0, 1015)",
115
+ "context.lineTo(1000, 1015)",
116
+ "context.stroke()",
117
+ "context.lineWidth=0.12;",
118
+ "context.strokeStyle=\\"#111\\";",
119
+ "context.textBaseline=\\"middle\\";",
120
+ "context.font=\\"400 13px 'Roboto', arial\\";",
121
+ "context.fillStyle=\\"#000\\";",
122
+ "context.textAlign=\\"right\\";",
123
+ "context.fillText(\\"1\\", 141, 39)",
124
+ "context.lineWidth=1.2000000000000002;",
125
+ "context.fillStyle=\\"#f3f7fe\\";",
126
+ "context.fillStyle=\\"#f3f7fe\\";",
127
+ "context.strokeStyle=\\"#3266ca\\";",
128
+ "context.lineWidth=0.6000000000000001;",
129
+ "context.globalCompositeOperation=\\"multiply\\";",
130
+ "context.fillRect(48, 26, 96, 23)",
131
+ "context.strokeRect(48, 26, 96, 23)",
132
+ "context.globalCompositeOperation=\\"source-over\\";",
133
+ "context.strokeStyle=\\"#3266ca\\";",
134
+ "context.lineWidth=1.2000000000000002;",
135
+ "context.strokeRect(48, 26, 96, 23)",
136
+ "context.fillStyle=\\"#F8F9FA\\";",
137
+ "context.font=\\"400 11px 'Roboto', arial\\";",
138
+ "context.textAlign=\\"center\\";",
139
+ "context.textBaseline=\\"middle\\";",
140
+ "context.lineWidth=0.4;",
141
+ "context.strokeStyle=\\"#333\\";",
142
+ "context.fillRect(0, 0, 1000, 26)",
143
+ "context.fillRect(0, 0, 48, 1000)",
144
+ "context.fillStyle=\\"#E8EAED\\";",
145
+ "context.fillStyle=\\"#E8EAED\\";",
146
+ "context.fillRect(48, 0, 96, 26)",
147
+ "context.fillStyle=\\"#E8EAED\\";",
148
+ "context.fillRect(0, 26, 48, 23)",
149
+ "context.beginPath()",
150
+ "context.moveTo(48, 0)",
151
+ "context.lineTo(48, 1000)",
152
+ "context.moveTo(0, 26)",
153
+ "context.lineTo(1000, 26)",
154
+ "context.strokeStyle=\\"#C0C0C0\\";",
155
+ "context.stroke()",
156
+ "context.beginPath()",
157
+ "context.fillStyle=\\"#666666\\";",
158
+ "context.fillText(\\"A\\", 96, 13)",
159
+ "context.moveTo(144, 0)",
160
+ "context.lineTo(144, 26)",
161
+ "context.fillStyle=\\"#666666\\";",
162
+ "context.fillText(\\"B\\", 192, 13)",
163
+ "context.moveTo(240, 0)",
164
+ "context.lineTo(240, 26)",
165
+ "context.fillStyle=\\"#666666\\";",
166
+ "context.fillText(\\"C\\", 288, 13)",
167
+ "context.moveTo(336, 0)",
168
+ "context.lineTo(336, 26)",
169
+ "context.fillStyle=\\"#666666\\";",
170
+ "context.fillText(\\"D\\", 384, 13)",
171
+ "context.moveTo(432, 0)",
172
+ "context.lineTo(432, 26)",
173
+ "context.fillStyle=\\"#666666\\";",
174
+ "context.fillText(\\"E\\", 480, 13)",
175
+ "context.moveTo(528, 0)",
176
+ "context.lineTo(528, 26)",
177
+ "context.fillStyle=\\"#666666\\";",
178
+ "context.fillText(\\"F\\", 576, 13)",
179
+ "context.moveTo(624, 0)",
180
+ "context.lineTo(624, 26)",
181
+ "context.fillStyle=\\"#666666\\";",
182
+ "context.fillText(\\"G\\", 672, 13)",
183
+ "context.moveTo(720, 0)",
184
+ "context.lineTo(720, 26)",
185
+ "context.fillStyle=\\"#666666\\";",
186
+ "context.fillText(\\"H\\", 768, 13)",
187
+ "context.moveTo(816, 0)",
188
+ "context.lineTo(816, 26)",
189
+ "context.fillStyle=\\"#666666\\";",
190
+ "context.fillText(\\"I\\", 864, 13)",
191
+ "context.moveTo(912, 0)",
192
+ "context.lineTo(912, 26)",
193
+ "context.fillStyle=\\"#666666\\";",
194
+ "context.fillText(\\"J\\", 960, 13)",
195
+ "context.moveTo(1008, 0)",
196
+ "context.lineTo(1008, 26)",
197
+ "context.fillStyle=\\"#666666\\";",
198
+ "context.fillText(\\"1\\", 24, 37.5)",
199
+ "context.moveTo(0, 49)",
200
+ "context.lineTo(48, 49)",
201
+ "context.fillStyle=\\"#666666\\";",
202
+ "context.fillText(\\"2\\", 24, 60.5)",
203
+ "context.moveTo(0, 72)",
204
+ "context.lineTo(48, 72)",
205
+ "context.fillStyle=\\"#666666\\";",
206
+ "context.fillText(\\"3\\", 24, 83.5)",
207
+ "context.moveTo(0, 95)",
208
+ "context.lineTo(48, 95)",
209
+ "context.fillStyle=\\"#666666\\";",
210
+ "context.fillText(\\"4\\", 24, 106.5)",
211
+ "context.moveTo(0, 118)",
212
+ "context.lineTo(48, 118)",
213
+ "context.fillStyle=\\"#666666\\";",
214
+ "context.fillText(\\"5\\", 24, 129.5)",
215
+ "context.moveTo(0, 141)",
216
+ "context.lineTo(48, 141)",
217
+ "context.fillStyle=\\"#666666\\";",
218
+ "context.fillText(\\"6\\", 24, 152.5)",
219
+ "context.moveTo(0, 164)",
220
+ "context.lineTo(48, 164)",
221
+ "context.fillStyle=\\"#666666\\";",
222
+ "context.fillText(\\"7\\", 24, 175.5)",
223
+ "context.moveTo(0, 187)",
224
+ "context.lineTo(48, 187)",
225
+ "context.fillStyle=\\"#666666\\";",
226
+ "context.fillText(\\"8\\", 24, 198.5)",
227
+ "context.moveTo(0, 210)",
228
+ "context.lineTo(48, 210)",
229
+ "context.fillStyle=\\"#666666\\";",
230
+ "context.fillText(\\"9\\", 24, 221.5)",
231
+ "context.moveTo(0, 233)",
232
+ "context.lineTo(48, 233)",
233
+ "context.fillStyle=\\"#666666\\";",
234
+ "context.fillText(\\"10\\", 24, 244.5)",
235
+ "context.moveTo(0, 256)",
236
+ "context.lineTo(48, 256)",
237
+ "context.fillStyle=\\"#666666\\";",
238
+ "context.fillText(\\"11\\", 24, 267.5)",
239
+ "context.moveTo(0, 279)",
240
+ "context.lineTo(48, 279)",
241
+ "context.fillStyle=\\"#666666\\";",
242
+ "context.fillText(\\"12\\", 24, 290.5)",
243
+ "context.moveTo(0, 302)",
244
+ "context.lineTo(48, 302)",
245
+ "context.fillStyle=\\"#666666\\";",
246
+ "context.fillText(\\"13\\", 24, 313.5)",
247
+ "context.moveTo(0, 325)",
248
+ "context.lineTo(48, 325)",
249
+ "context.fillStyle=\\"#666666\\";",
250
+ "context.fillText(\\"14\\", 24, 336.5)",
251
+ "context.moveTo(0, 348)",
252
+ "context.lineTo(48, 348)",
253
+ "context.fillStyle=\\"#666666\\";",
254
+ "context.fillText(\\"15\\", 24, 359.5)",
255
+ "context.moveTo(0, 371)",
256
+ "context.lineTo(48, 371)",
257
+ "context.fillStyle=\\"#666666\\";",
258
+ "context.fillText(\\"16\\", 24, 382.5)",
259
+ "context.moveTo(0, 394)",
260
+ "context.lineTo(48, 394)",
261
+ "context.fillStyle=\\"#666666\\";",
262
+ "context.fillText(\\"17\\", 24, 405.5)",
263
+ "context.moveTo(0, 417)",
264
+ "context.lineTo(48, 417)",
265
+ "context.fillStyle=\\"#666666\\";",
266
+ "context.fillText(\\"18\\", 24, 428.5)",
267
+ "context.moveTo(0, 440)",
268
+ "context.lineTo(48, 440)",
269
+ "context.fillStyle=\\"#666666\\";",
270
+ "context.fillText(\\"19\\", 24, 451.5)",
271
+ "context.moveTo(0, 463)",
272
+ "context.lineTo(48, 463)",
273
+ "context.fillStyle=\\"#666666\\";",
274
+ "context.fillText(\\"20\\", 24, 474.5)",
275
+ "context.moveTo(0, 486)",
276
+ "context.lineTo(48, 486)",
277
+ "context.fillStyle=\\"#666666\\";",
278
+ "context.fillText(\\"21\\", 24, 497.5)",
279
+ "context.moveTo(0, 509)",
280
+ "context.lineTo(48, 509)",
281
+ "context.fillStyle=\\"#666666\\";",
282
+ "context.fillText(\\"22\\", 24, 520.5)",
283
+ "context.moveTo(0, 532)",
284
+ "context.lineTo(48, 532)",
285
+ "context.fillStyle=\\"#666666\\";",
286
+ "context.fillText(\\"23\\", 24, 543.5)",
287
+ "context.moveTo(0, 555)",
288
+ "context.lineTo(48, 555)",
289
+ "context.fillStyle=\\"#666666\\";",
290
+ "context.fillText(\\"24\\", 24, 566.5)",
291
+ "context.moveTo(0, 578)",
292
+ "context.lineTo(48, 578)",
293
+ "context.fillStyle=\\"#666666\\";",
294
+ "context.fillText(\\"25\\", 24, 589.5)",
295
+ "context.moveTo(0, 601)",
296
+ "context.lineTo(48, 601)",
297
+ "context.fillStyle=\\"#666666\\";",
298
+ "context.fillText(\\"26\\", 24, 612.5)",
299
+ "context.moveTo(0, 624)",
300
+ "context.lineTo(48, 624)",
301
+ "context.fillStyle=\\"#666666\\";",
302
+ "context.fillText(\\"27\\", 24, 635.5)",
303
+ "context.moveTo(0, 647)",
304
+ "context.lineTo(48, 647)",
305
+ "context.fillStyle=\\"#666666\\";",
306
+ "context.fillText(\\"28\\", 24, 658.5)",
307
+ "context.moveTo(0, 670)",
308
+ "context.lineTo(48, 670)",
309
+ "context.fillStyle=\\"#666666\\";",
310
+ "context.fillText(\\"29\\", 24, 681.5)",
311
+ "context.moveTo(0, 693)",
312
+ "context.lineTo(48, 693)",
313
+ "context.fillStyle=\\"#666666\\";",
314
+ "context.fillText(\\"30\\", 24, 704.5)",
315
+ "context.moveTo(0, 716)",
316
+ "context.lineTo(48, 716)",
317
+ "context.fillStyle=\\"#666666\\";",
318
+ "context.fillText(\\"31\\", 24, 727.5)",
319
+ "context.moveTo(0, 739)",
320
+ "context.lineTo(48, 739)",
321
+ "context.fillStyle=\\"#666666\\";",
322
+ "context.fillText(\\"32\\", 24, 750.5)",
323
+ "context.moveTo(0, 762)",
324
+ "context.lineTo(48, 762)",
325
+ "context.fillStyle=\\"#666666\\";",
326
+ "context.fillText(\\"33\\", 24, 773.5)",
327
+ "context.moveTo(0, 785)",
328
+ "context.lineTo(48, 785)",
329
+ "context.fillStyle=\\"#666666\\";",
330
+ "context.fillText(\\"34\\", 24, 796.5)",
331
+ "context.moveTo(0, 808)",
332
+ "context.lineTo(48, 808)",
333
+ "context.fillStyle=\\"#666666\\";",
334
+ "context.fillText(\\"35\\", 24, 819.5)",
335
+ "context.moveTo(0, 831)",
336
+ "context.lineTo(48, 831)",
337
+ "context.fillStyle=\\"#666666\\";",
338
+ "context.fillText(\\"36\\", 24, 842.5)",
339
+ "context.moveTo(0, 854)",
340
+ "context.lineTo(48, 854)",
341
+ "context.fillStyle=\\"#666666\\";",
342
+ "context.fillText(\\"37\\", 24, 865.5)",
343
+ "context.moveTo(0, 877)",
344
+ "context.lineTo(48, 877)",
345
+ "context.fillStyle=\\"#666666\\";",
346
+ "context.fillText(\\"38\\", 24, 888.5)",
347
+ "context.moveTo(0, 900)",
348
+ "context.lineTo(48, 900)",
349
+ "context.fillStyle=\\"#666666\\";",
350
+ "context.fillText(\\"39\\", 24, 911.5)",
351
+ "context.moveTo(0, 923)",
352
+ "context.lineTo(48, 923)",
353
+ "context.fillStyle=\\"#666666\\";",
354
+ "context.fillText(\\"40\\", 24, 934.5)",
355
+ "context.moveTo(0, 946)",
356
+ "context.lineTo(48, 946)",
357
+ "context.fillStyle=\\"#666666\\";",
358
+ "context.fillText(\\"41\\", 24, 957.5)",
359
+ "context.moveTo(0, 969)",
360
+ "context.lineTo(48, 969)",
361
+ "context.fillStyle=\\"#666666\\";",
362
+ "context.fillText(\\"42\\", 24, 980.5)",
363
+ "context.moveTo(0, 992)",
364
+ "context.lineTo(48, 992)",
365
+ "context.fillStyle=\\"#666666\\";",
366
+ "context.fillText(\\"43\\", 24, 1003.5)",
367
+ "context.moveTo(0, 1015)",
368
+ "context.lineTo(48, 1015)",
369
+ "context.stroke()",
370
+ ]
371
+ `;