@onetype/framework 2.0.53 → 2.0.55

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 (150) hide show
  1. package/addons/float/popup/css/popup.css +2 -2
  2. package/addons/render/directives/front/functions/process.js +3 -1
  3. package/addons/render/directives/front/items/self/160-slot.js +9 -1
  4. package/addons/render/editor/addon.js +13 -0
  5. package/addons/render/editor/functions/block/add.js +57 -0
  6. package/addons/render/editor/functions/block/delete.js +32 -0
  7. package/addons/render/editor/functions/block/find.js +30 -0
  8. package/addons/render/editor/functions/render/block.js +114 -0
  9. package/addons/render/editor/functions/render/blocks.js +31 -0
  10. package/addons/render/editor/items/elements/editor.js +69 -0
  11. package/addons/render/editor/items/self/paragraph.js +21 -0
  12. package/addons/render/editor/styles/editor.css +252 -0
  13. package/addons/render/elements/front/functions/types/colors/badge.js +19 -0
  14. package/addons/render/elements/front/functions/types/colors/status.js +24 -0
  15. package/addons/render/elements/front/functions/types/escape.js +8 -0
  16. package/addons/render/elements/front/functions/types/format/currency.js +16 -0
  17. package/addons/render/elements/front/functions/types/format/date.js +16 -0
  18. package/addons/render/elements/front/functions/types/format/number.js +24 -0
  19. package/addons/render/elements/front/functions/types/format/timeago.js +43 -0
  20. package/addons/render/elements/front/functions/types/render/avatar.js +10 -0
  21. package/addons/render/elements/front/functions/types/render/badge.js +17 -0
  22. package/addons/render/elements/front/functions/types/render/boolean.js +8 -0
  23. package/addons/render/elements/front/functions/types/render/chip.js +6 -0
  24. package/addons/render/elements/front/functions/types/render/currency.js +7 -0
  25. package/addons/render/elements/front/functions/types/render/date.js +6 -0
  26. package/addons/render/elements/front/functions/types/render/description.js +12 -0
  27. package/addons/render/elements/front/functions/types/render/group.js +11 -0
  28. package/addons/render/elements/front/functions/types/render/icon.js +8 -0
  29. package/addons/render/elements/front/functions/types/render/image.js +9 -0
  30. package/addons/render/elements/front/functions/types/render/link.js +8 -0
  31. package/addons/render/elements/front/functions/types/render/media.js +16 -0
  32. package/addons/render/elements/front/functions/types/render/metric.js +13 -0
  33. package/addons/render/elements/front/functions/types/render/number.js +6 -0
  34. package/addons/render/elements/front/functions/types/render/progress.js +13 -0
  35. package/addons/render/elements/front/functions/types/render/status.js +12 -0
  36. package/addons/render/elements/front/functions/types/render/tag.js +6 -0
  37. package/addons/render/elements/front/functions/types/render/tags.js +11 -0
  38. package/addons/render/elements/front/functions/types/render/text.js +8 -0
  39. package/addons/render/elements/front/functions/types/render/timeago.js +6 -0
  40. package/addons/render/elements/front/functions/types/render.js +16 -0
  41. package/addons/render/elements/front/items/directives/element.js +8 -3
  42. package/addons/render/elements/front/items/self/cards/info/info.css +499 -0
  43. package/addons/render/elements/front/items/self/cards/info/info.js +224 -0
  44. package/addons/render/elements/front/items/self/cards/item/item.css +614 -0
  45. package/addons/render/elements/front/items/self/cards/item/item.js +200 -0
  46. package/addons/render/elements/front/items/self/cards/pricing/pricing.css +318 -46
  47. package/addons/render/elements/front/items/self/cards/pricing/pricing.js +81 -30
  48. package/addons/render/elements/front/items/self/cards/profile/profile.css +446 -0
  49. package/addons/render/elements/front/items/self/cards/profile/profile.js +186 -0
  50. package/addons/render/elements/front/items/self/cards/share/share.css +445 -0
  51. package/addons/render/elements/front/items/self/cards/share/share.js +316 -0
  52. package/addons/render/elements/front/items/self/cards/stat/stat.css +356 -0
  53. package/addons/render/elements/front/items/self/cards/stat/stat.js +146 -0
  54. package/addons/render/elements/front/items/self/charts/bar/bar.css +263 -0
  55. package/addons/render/elements/front/items/self/charts/bar/bar.js +156 -0
  56. package/addons/render/elements/front/items/self/charts/donut/donut.css +222 -0
  57. package/addons/render/elements/front/items/self/charts/donut/donut.js +164 -0
  58. package/addons/render/elements/front/items/self/charts/line/line.css +229 -0
  59. package/addons/render/elements/front/items/self/charts/line/line.js +249 -0
  60. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.css +102 -0
  61. package/addons/render/elements/front/items/self/charts/sparkline/sparkline.js +164 -0
  62. package/addons/render/elements/front/items/self/core/builder/builder.css +71 -116
  63. package/addons/render/elements/front/items/self/core/builder/builder.js +212 -127
  64. package/addons/render/elements/front/items/self/core/repeater/repeater.css +338 -71
  65. package/addons/render/elements/front/items/self/core/repeater/repeater.js +191 -44
  66. package/addons/render/elements/front/items/self/data/filters/filters.css +541 -0
  67. package/addons/render/elements/front/items/self/data/filters/filters.js +504 -0
  68. package/addons/render/elements/front/items/self/data/table/table.css +588 -0
  69. package/addons/render/elements/front/items/self/data/table/table.js +589 -0
  70. package/addons/render/elements/front/items/self/form/button/button.css +430 -103
  71. package/addons/render/elements/front/items/self/form/button/button.js +109 -101
  72. package/addons/render/elements/front/items/self/form/checkbox/checkbox.css +356 -39
  73. package/addons/render/elements/front/items/self/form/checkbox/checkbox.js +109 -75
  74. package/addons/render/elements/front/items/self/form/color/color.css +255 -61
  75. package/addons/render/elements/front/items/self/form/color/color.js +135 -41
  76. package/addons/render/elements/front/items/self/form/date/date.css +289 -38
  77. package/addons/render/elements/front/items/self/form/date/date.js +108 -24
  78. package/addons/render/elements/front/items/self/form/editor/editor.css +447 -0
  79. package/addons/render/elements/front/items/self/form/editor/editor.js +794 -0
  80. package/addons/render/elements/front/items/self/form/field/field.css +160 -29
  81. package/addons/render/elements/front/items/self/form/field/field.js +36 -16
  82. package/addons/render/elements/front/items/self/form/input/input.css +272 -32
  83. package/addons/render/elements/front/items/self/form/input/input.js +324 -124
  84. package/addons/render/elements/front/items/self/form/radio/radio.css +310 -45
  85. package/addons/render/elements/front/items/self/form/radio/radio.js +99 -80
  86. package/addons/render/elements/front/items/self/form/rating/rating.css +234 -57
  87. package/addons/render/elements/front/items/self/form/rating/rating.js +216 -86
  88. package/addons/render/elements/front/items/self/form/section/section.css +247 -32
  89. package/addons/render/elements/front/items/self/form/section/section.js +53 -16
  90. package/addons/render/elements/front/items/self/form/select/select.css +362 -64
  91. package/addons/render/elements/front/items/self/form/select/select.js +156 -30
  92. package/addons/render/elements/front/items/self/form/slider/slider.css +331 -123
  93. package/addons/render/elements/front/items/self/form/slider/slider.js +124 -26
  94. package/addons/render/elements/front/items/self/form/tags/tags.css +328 -53
  95. package/addons/render/elements/front/items/self/form/tags/tags.js +155 -28
  96. package/addons/render/elements/front/items/self/form/textarea/textarea.css +128 -27
  97. package/addons/render/elements/front/items/self/form/textarea/textarea.js +172 -113
  98. package/addons/render/elements/front/items/self/form/toggle/toggle.css +239 -39
  99. package/addons/render/elements/front/items/self/form/toggle/toggle.js +32 -17
  100. package/addons/render/elements/front/items/self/form/transfer/transfer.css +377 -0
  101. package/addons/render/elements/front/items/self/form/transfer/transfer.js +453 -0
  102. package/addons/render/elements/front/items/self/form/upload/upload.css +408 -0
  103. package/addons/render/elements/front/items/self/form/upload/upload.js +469 -0
  104. package/addons/render/elements/front/items/self/global/accordion/accordion.css +377 -0
  105. package/addons/render/elements/front/items/self/global/accordion/accordion.js +135 -0
  106. package/addons/render/elements/front/items/self/global/code/code.css +207 -44
  107. package/addons/render/elements/front/items/self/global/code/code.js +327 -19
  108. package/addons/render/elements/front/items/self/global/gallery/gallery.css +521 -0
  109. package/addons/render/elements/front/items/self/global/gallery/gallery.js +291 -0
  110. package/addons/render/elements/front/items/self/global/heading/heading.css +151 -49
  111. package/addons/render/elements/front/items/self/global/heading/heading.js +30 -15
  112. package/addons/render/elements/front/items/self/global/markdown/markdown.css +284 -135
  113. package/addons/render/elements/front/items/self/global/markdown/markdown.js +35 -5
  114. package/addons/render/elements/front/items/self/global/menu/menu.css +311 -56
  115. package/addons/render/elements/front/items/self/global/menu/menu.js +95 -47
  116. package/addons/render/elements/front/items/self/global/notice/notice.css +263 -23
  117. package/addons/render/elements/front/items/self/global/notice/notice.js +51 -11
  118. package/addons/render/elements/front/items/self/global/parameters/parameters.css +276 -33
  119. package/addons/render/elements/front/items/self/global/parameters/parameters.js +86 -16
  120. package/addons/render/elements/front/items/self/global/tags/tags.css +215 -29
  121. package/addons/render/elements/front/items/self/global/tags/tags.js +91 -17
  122. package/addons/render/elements/front/items/self/navigation/dock/dock.css +221 -0
  123. package/addons/render/elements/front/items/self/navigation/dock/dock.js +134 -0
  124. package/addons/render/elements/front/items/self/navigation/footer/footer.css +356 -0
  125. package/addons/render/elements/front/items/self/navigation/footer/footer.js +219 -0
  126. package/addons/render/elements/front/items/self/navigation/navbar/navbar.css +736 -76
  127. package/addons/render/elements/front/items/self/navigation/navbar/navbar.js +437 -29
  128. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.css +327 -196
  129. package/addons/render/elements/front/items/self/navigation/sidebar/sidebar.js +115 -62
  130. package/addons/render/elements/front/items/self/navigation/steps/steps.css +345 -0
  131. package/addons/render/elements/front/items/self/navigation/steps/steps.js +113 -0
  132. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +362 -33
  133. package/addons/render/elements/front/items/self/navigation/tabs/tabs.js +62 -19
  134. package/addons/render/elements/front/items/self/status/code/code.css +83 -12
  135. package/addons/render/elements/front/items/self/status/code/code.js +15 -4
  136. package/addons/render/elements/front/items/self/status/empty/empty.css +95 -15
  137. package/addons/render/elements/front/items/self/status/empty/empty.js +17 -12
  138. package/addons/render/elements/front/items/self/status/error/error.css +99 -14
  139. package/addons/render/elements/front/items/self/status/error/error.js +21 -11
  140. package/addons/render/elements/front/items/self/status/loading/loading.css +85 -14
  141. package/addons/render/elements/front/items/self/status/loading/loading.js +5 -6
  142. package/addons/render/elements/front/styles/types.css +363 -0
  143. package/instructions.txt +28 -0
  144. package/lib/load.js +1 -0
  145. package/lib/styles/reset.css +89 -76
  146. package/package.json +1 -1
  147. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +0 -410
  148. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +0 -191
  149. package/addons/render/elements/front/items/self/global/faq/faq.css +0 -98
  150. package/addons/render/elements/front/items/self/global/faq/faq.js +0 -56
@@ -4,7 +4,7 @@ onetype.AddonReady('elements', (elements) =>
4
4
  id: 'core-repeater',
5
5
  icon: 'repeat',
6
6
  name: 'Repeater',
7
- description: 'Repeatable rows of fields with add, remove, and reorder.',
7
+ description: 'Premium repeatable rows with drag reorder, duplicate, numbered rows, orientation modes and rich empty state.',
8
8
  category: 'Core',
9
9
  author: 'OneType',
10
10
  config: {
@@ -21,29 +21,58 @@ onetype.AddonReady('elements', (elements) =>
21
21
  each: {
22
22
  type: 'object',
23
23
  config: {
24
- key: { type: 'string', value: '' },
25
- label: { type: 'string', value: '' },
26
- element: { type: 'string', value: '' },
27
- properties: { type: 'object', value: {} },
28
- default: { type: 'string', value: '' }
24
+ key: { type: 'string' },
25
+ label: { type: 'string' },
26
+ description: { type: 'string' },
27
+ element: { type: 'string' },
28
+ properties: { type: 'object' },
29
+ default: { type: 'string' }
29
30
  }
30
31
  }
31
32
  },
33
+ orientation: {
34
+ type: 'string',
35
+ value: 'horizontal',
36
+ options: ['horizontal', 'vertical']
37
+ },
32
38
  add: {
33
39
  type: 'string',
34
40
  value: 'Add'
35
41
  },
42
+ addPosition: {
43
+ type: 'string',
44
+ value: 'bottom',
45
+ options: ['top', 'bottom', 'both']
46
+ },
36
47
  save: {
48
+ type: 'string'
49
+ },
50
+ empty: {
51
+ type: 'string',
52
+ value: 'No items yet'
53
+ },
54
+ emptyIcon: {
37
55
  type: 'string',
38
- value: ''
56
+ value: 'inbox'
57
+ },
58
+ min: {
59
+ type: 'number'
39
60
  },
40
61
  max: {
41
- type: 'number',
42
- value: 0
62
+ type: 'number'
43
63
  },
44
- disabled: {
64
+ draggable: {
45
65
  type: 'boolean',
46
- value: false
66
+ value: true
67
+ },
68
+ numbered: {
69
+ type: 'boolean'
70
+ },
71
+ duplicable: {
72
+ type: 'boolean'
73
+ },
74
+ disabled: {
75
+ type: 'boolean'
47
76
  },
48
77
  variant: {
49
78
  type: 'array',
@@ -59,8 +88,6 @@ onetype.AddonReady('elements', (elements) =>
59
88
  },
60
89
  render: function()
61
90
  {
62
- // Helpers
63
-
64
91
  this.defaults = () =>
65
92
  {
66
93
  const row = {};
@@ -73,14 +100,29 @@ onetype.AddonReady('elements', (elements) =>
73
100
  return row;
74
101
  };
75
102
 
76
- this.allowed = () =>
103
+ this.canAdd = () =>
104
+ {
105
+ if(this.disabled)
106
+ {
107
+ return false;
108
+ }
109
+
110
+ if(this.max > 0 && this.value.length >= this.max)
111
+ {
112
+ return false;
113
+ }
114
+
115
+ return true;
116
+ };
117
+
118
+ this.canRemove = () =>
77
119
  {
78
- if (this.disabled)
120
+ if(this.disabled)
79
121
  {
80
122
  return false;
81
123
  }
82
124
 
83
- if (this.max > 0 && this.value.length >= this.max)
125
+ if(this.min > 0 && this.value.length <= this.min)
84
126
  {
85
127
  return false;
86
128
  }
@@ -90,17 +132,15 @@ onetype.AddonReady('elements', (elements) =>
90
132
 
91
133
  this.emit = () =>
92
134
  {
93
- if (this._change)
135
+ if(this._change)
94
136
  {
95
137
  this._change({ value: this.value });
96
138
  }
97
139
  };
98
140
 
99
- // Actions
100
-
101
141
  this.append = () =>
102
142
  {
103
- if (!this.allowed())
143
+ if(!this.canAdd())
104
144
  {
105
145
  return;
106
146
  }
@@ -110,9 +150,21 @@ onetype.AddonReady('elements', (elements) =>
110
150
  this.emit();
111
151
  };
112
152
 
153
+ this.prepend = () =>
154
+ {
155
+ if(!this.canAdd())
156
+ {
157
+ return;
158
+ }
159
+
160
+ this.value.unshift(this.defaults());
161
+ this.Update();
162
+ this.emit();
163
+ };
164
+
113
165
  this.remove = (index) =>
114
166
  {
115
- if (this.disabled)
167
+ if(!this.canRemove())
116
168
  {
117
169
  return;
118
170
  }
@@ -122,15 +174,27 @@ onetype.AddonReady('elements', (elements) =>
122
174
  this.emit();
123
175
  };
124
176
 
177
+ this.duplicate = (index) =>
178
+ {
179
+ if(!this.canAdd())
180
+ {
181
+ return;
182
+ }
183
+
184
+ const copy = JSON.parse(JSON.stringify(this.value[index]));
185
+ this.value.splice(index + 1, 0, copy);
186
+ this.Update();
187
+ this.emit();
188
+ };
189
+
125
190
  this.up = (index) =>
126
191
  {
127
- if (index === 0)
192
+ if(index === 0 || this.disabled)
128
193
  {
129
194
  return;
130
195
  }
131
196
 
132
197
  const row = this.value.splice(index, 1)[0];
133
-
134
198
  this.value.splice(index - 1, 0, row);
135
199
  this.Update();
136
200
  this.emit();
@@ -138,13 +202,12 @@ onetype.AddonReady('elements', (elements) =>
138
202
 
139
203
  this.down = (index) =>
140
204
  {
141
- if (index >= this.value.length - 1)
205
+ if(index >= this.value.length - 1 || this.disabled)
142
206
  {
143
207
  return;
144
208
  }
145
209
 
146
210
  const row = this.value.splice(index, 1)[0];
147
-
148
211
  this.value.splice(index + 1, 0, row);
149
212
  this.Update();
150
213
  this.emit();
@@ -152,23 +215,21 @@ onetype.AddonReady('elements', (elements) =>
152
215
 
153
216
  this.submit = () =>
154
217
  {
155
- if (this._save)
218
+ if(this._save)
156
219
  {
157
220
  this._save({ value: this.value });
158
221
  }
159
222
  };
160
223
 
161
- // Field change
162
-
163
224
  this.change = (index, key, data) =>
164
225
  {
165
226
  this.value[index][key] = data.value;
166
227
  this.emit();
167
228
  };
168
229
 
169
- // Build field elements
230
+ // Build field columns — each field is an element with two-way binding
170
231
 
171
- const columns = this.fields.map((field) =>
232
+ const fieldTemplate = this.fields.map((field) =>
172
233
  {
173
234
  const tag = 'e-' + field.element;
174
235
  const props = field.properties || {};
@@ -179,7 +240,7 @@ onetype.AddonReady('elements', (elements) =>
179
240
  {
180
241
  const val = props[key];
181
242
 
182
- if (typeof val === 'string')
243
+ if(typeof val === 'string')
183
244
  {
184
245
  attrs += ` ${key}="${val}"`;
185
246
  }
@@ -189,33 +250,119 @@ onetype.AddonReady('elements', (elements) =>
189
250
  }
190
251
  });
191
252
 
192
- const label = field.label
193
- ? `<span class="label">${field.label}</span>`
253
+ const labelBlock = field.label
254
+ ? `
255
+ <div class="field-info">
256
+ <span class="field-label">${field.label}</span>
257
+ ${field.description ? `<span class="field-description">${field.description}</span>` : ''}
258
+ </div>
259
+ `
194
260
  : '';
195
261
 
196
- return `<div class="column">${label}<${tag} #class="field" :value="row['${field.key}']" :_change="(data) => change(row_index, '${field.key}', data)"${attrs}></${tag}></div>`;
262
+ return `
263
+ <div class="field">
264
+ ${labelBlock}
265
+ <${tag} :value="row['${field.key}']" :_change="(data) => change(row_index, '${field.key}', data)"${attrs}></${tag}>
266
+ </div>
267
+ `;
197
268
  }).join('');
198
269
 
199
- return `
200
- <div :class="'holder ' + variant.join(' ')">
270
+ return /* html */ `
271
+ <div :class="'holder ' + orientation + ' ' + variant.join(' ') + (disabled ? ' disabled' : '')">
272
+ <div ot-if="addPosition === 'top' || addPosition === 'both'" class="footer top">
273
+ <span ot-if="max" class="counter">{{ value.length }} / {{ max }}</span>
274
+ <span ot-if="!max" class="counter">{{ value.length }} items</span>
275
+ <e-form-button
276
+ ot-if="canAdd()"
277
+ :text="add"
278
+ icon="add"
279
+ :_click="prepend"
280
+ :variant="['bg-1', 'border', 'size-s']"
281
+ ></e-form-button>
282
+ </div>
283
+
201
284
  <div ot-if="value.length" class="rows">
202
285
  <div ot-for="row, row_index in value" class="row">
286
+ <div ot-if="draggable && !disabled" class="reorder">
287
+ <button
288
+ type="button"
289
+ class="action"
290
+ :disabled="row_index === 0"
291
+ ot-click="() => up(row_index)"
292
+ :ot-tooltip="{ text: 'Move up', position: { x: 'center', y: 'top' } }"
293
+ >
294
+ <i>keyboard_arrow_up</i>
295
+ </button>
296
+ <button
297
+ type="button"
298
+ class="action"
299
+ :disabled="row_index === value.length - 1"
300
+ ot-click="() => down(row_index)"
301
+ :ot-tooltip="{ text: 'Move down', position: { x: 'center', y: 'top' } }"
302
+ >
303
+ <i>keyboard_arrow_down</i>
304
+ </button>
305
+ </div>
306
+
307
+ <div ot-if="numbered" class="number">{{ row_index + 1 }}</div>
308
+
203
309
  <div class="fields">
204
- ${columns}
310
+ ${fieldTemplate}
205
311
  </div>
312
+
206
313
  <div ot-if="!disabled" class="actions">
207
- <i ot-if="row_index > 0" class="action" ot-click="() => up(row_index)">arrow_upward</i>
208
- <i ot-if="row_index < value.length - 1" class="action" ot-click="() => down(row_index)">arrow_downward</i>
209
- <i class="action remove" ot-click="() => remove(row_index)">close</i>
314
+ <button
315
+ ot-if="duplicable && canAdd()"
316
+ type="button"
317
+ class="action"
318
+ ot-click="() => duplicate(row_index)"
319
+ :ot-tooltip="{ text: 'Duplicate', position: { x: 'center', y: 'top' } }"
320
+ >
321
+ <i>content_copy</i>
322
+ </button>
323
+ <button
324
+ ot-if="canRemove()"
325
+ type="button"
326
+ class="action danger"
327
+ ot-click="() => remove(row_index)"
328
+ :ot-tooltip="{ text: 'Remove', position: { x: 'center', y: 'top' } }"
329
+ >
330
+ <i>close</i>
331
+ </button>
210
332
  </div>
211
333
  </div>
212
334
  </div>
335
+
213
336
  <div ot-if="!value.length" class="empty">
214
- <span>No items</span>
337
+ <div class="empty-icon"><i>{{ emptyIcon }}</i></div>
338
+ <span class="empty-text">{{ empty }}</span>
339
+ <e-form-button
340
+ ot-if="!disabled && canAdd()"
341
+ :text="add"
342
+ icon="add"
343
+ :_click="append"
344
+ :variant="['brand', 'size-m']"
345
+ ></e-form-button>
215
346
  </div>
216
- <div class="footer">
217
- <e-form-button ot-if="allowed()" :text="add" icon="add" :_click="append" :variant="['bg-2', 'border', 'size-s']"></e-form-button>
218
- <e-form-button ot-if="save" :text="save" :_click="submit" :variant="['brand', 'size-s']"></e-form-button>
347
+
348
+ <div ot-if="value.length && (addPosition === 'bottom' || addPosition === 'both')" class="footer bottom">
349
+ <span ot-if="max" class="counter">{{ value.length }} / {{ max }}</span>
350
+ <span ot-if="!max" class="counter">{{ value.length }} items</span>
351
+ <div class="footer-actions">
352
+ <e-form-button
353
+ ot-if="canAdd()"
354
+ :text="add"
355
+ icon="add"
356
+ :_click="append"
357
+ :variant="['bg-1', 'border', 'size-s']"
358
+ ></e-form-button>
359
+ <e-form-button
360
+ ot-if="save"
361
+ :text="save"
362
+ :_click="submit"
363
+ :variant="['brand', 'size-s']"
364
+ ></e-form-button>
365
+ </div>
219
366
  </div>
220
367
  </div>
221
368
  `;