@vuetify/nightly 3.6.3-master.2024-05-07 → 3.6.4-master.2024-05-08

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 (85) hide show
  1. package/CHANGELOG.md +2 -17
  2. package/dist/json/attributes.json +30 -30
  3. package/dist/json/importMap-labs.json +14 -14
  4. package/dist/json/importMap.json +110 -110
  5. package/dist/json/web-types.json +63 -63
  6. package/dist/vuetify-labs.css +2972 -2948
  7. package/dist/vuetify-labs.d.ts +995 -966
  8. package/dist/vuetify-labs.esm.js +88 -61
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +87 -60
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +1224 -1204
  13. package/dist/vuetify.d.ts +964 -935
  14. package/dist/vuetify.esm.js +88 -61
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +87 -60
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +980 -976
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/components/VAutocomplete/index.d.mts +169 -140
  22. package/lib/components/VBottomSheet/index.d.mts +33 -27
  23. package/lib/components/VColorPicker/VColorPickerCanvas.mjs +1 -1
  24. package/lib/components/VColorPicker/VColorPickerCanvas.mjs.map +1 -1
  25. package/lib/components/VCombobox/index.d.mts +169 -140
  26. package/lib/components/VDataIterator/index.d.mts +1 -1
  27. package/lib/components/VDataTable/VDataTable.css +1 -1
  28. package/lib/components/VDataTable/VDataTable.sass +2 -1
  29. package/lib/components/VDataTable/VDataTableHeaders.mjs +1 -1
  30. package/lib/components/VDataTable/VDataTableHeaders.mjs.map +1 -1
  31. package/lib/components/VDataTable/VDataTableVirtual.mjs.map +1 -1
  32. package/lib/components/VDataTable/composables/select.mjs +2 -1
  33. package/lib/components/VDataTable/composables/select.mjs.map +1 -1
  34. package/lib/components/VDataTable/index.d.mts +10 -5
  35. package/lib/components/VDatePicker/VDatePickerYears.mjs +4 -4
  36. package/lib/components/VDatePicker/VDatePickerYears.mjs.map +1 -1
  37. package/lib/components/VDialog/index.d.mts +99 -93
  38. package/lib/components/VInfiniteScroll/VInfiniteScroll.mjs +1 -1
  39. package/lib/components/VInfiniteScroll/VInfiniteScroll.mjs.map +1 -1
  40. package/lib/components/VList/VList.mjs.map +1 -1
  41. package/lib/components/VList/index.d.mts +70 -46
  42. package/lib/components/VMenu/index.d.mts +99 -93
  43. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  44. package/lib/components/VOverlay/index.d.mts +33 -27
  45. package/lib/components/VOverlay/useActivator.mjs +5 -5
  46. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  47. package/lib/components/VSelect/index.d.mts +169 -140
  48. package/lib/components/VSheet/VSheet.css +1 -1
  49. package/lib/components/VSheet/_variables.scss +1 -1
  50. package/lib/components/VSlideGroup/VSlideGroup.mjs +25 -25
  51. package/lib/components/VSlideGroup/VSlideGroup.mjs.map +1 -1
  52. package/lib/components/VSlider/VSliderThumb.css +5 -0
  53. package/lib/components/VSlider/VSliderThumb.sass +3 -0
  54. package/lib/components/VSlider/VSliderTrack.css +15 -0
  55. package/lib/components/VSlider/VSliderTrack.sass +9 -0
  56. package/lib/components/VSnackbar/index.d.mts +85 -79
  57. package/lib/components/VSpeedDial/index.d.mts +33 -27
  58. package/lib/components/VStepper/VStepperWindow.mjs +2 -1
  59. package/lib/components/VStepper/VStepperWindow.mjs.map +1 -1
  60. package/lib/components/VStepper/VStepperWindowItem.mjs +2 -1
  61. package/lib/components/VStepper/VStepperWindowItem.mjs.map +1 -1
  62. package/lib/components/VTabs/VTabsWindow.mjs +2 -1
  63. package/lib/components/VTabs/VTabsWindow.mjs.map +1 -1
  64. package/lib/components/VTooltip/index.d.mts +99 -93
  65. package/lib/components/VVirtualScroll/VVirtualScrollItem.mjs.map +1 -1
  66. package/lib/components/index.d.mts +926 -897
  67. package/lib/composables/nested/activeStrategies.mjs +16 -10
  68. package/lib/composables/nested/activeStrategies.mjs.map +1 -1
  69. package/lib/composables/nested/nested.mjs +7 -5
  70. package/lib/composables/nested/nested.mjs.map +1 -1
  71. package/lib/composables/resizeObserver.mjs +5 -5
  72. package/lib/composables/resizeObserver.mjs.map +1 -1
  73. package/lib/entry-bundler.mjs +1 -1
  74. package/lib/framework.mjs +1 -1
  75. package/lib/index.d.mts +38 -38
  76. package/lib/labs/VCalendar/VCalendar.css +5 -1
  77. package/lib/labs/VCalendar/VCalendar.sass +3 -2
  78. package/lib/labs/VCalendar/_variables.scss +8 -0
  79. package/lib/labs/VSnackbarQueue/index.d.mts +97 -91
  80. package/lib/labs/VTreeview/VTreeview.mjs.map +1 -1
  81. package/lib/labs/VTreeview/index.d.mts +82 -58
  82. package/lib/labs/components.d.mts +178 -149
  83. package/lib/util/helpers.mjs +16 -0
  84. package/lib/util/helpers.mjs.map +1 -1
  85. package/package.json +1 -1
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.6.3-master.2024-05-07
2
+ * Vuetify v3.6.4-master.2024-05-08
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -484,6 +484,22 @@
484
484
  const divBottom = divRect.bottom;
485
485
  return mouseX >= divLeft && mouseX <= divRight && mouseY >= divTop && mouseY <= divBottom;
486
486
  }
487
+ function templateRef() {
488
+ const el = vue.shallowRef();
489
+ const fn = target => {
490
+ el.value = target;
491
+ };
492
+ Object.defineProperty(fn, 'value', {
493
+ enumerable: true,
494
+ get: () => el.value,
495
+ set: val => el.value = val
496
+ });
497
+ Object.defineProperty(fn, 'el', {
498
+ enumerable: true,
499
+ get: () => refElement(el.value)
500
+ });
501
+ return fn;
502
+ }
487
503
 
488
504
  // Utilities
489
505
  const block = ['top', 'bottom'];
@@ -2009,7 +2025,7 @@
2009
2025
 
2010
2026
  function useResizeObserver(callback) {
2011
2027
  let box = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'content';
2012
- const resizeRef = vue.ref();
2028
+ const resizeRef = templateRef();
2013
2029
  const contentRect = vue.ref();
2014
2030
  if (IN_BROWSER) {
2015
2031
  const observer = new ResizeObserver(entries => {
@@ -2024,12 +2040,12 @@
2024
2040
  vue.onBeforeUnmount(() => {
2025
2041
  observer.disconnect();
2026
2042
  });
2027
- vue.watch(resizeRef, (newValue, oldValue) => {
2043
+ vue.watch(() => resizeRef.el, (newValue, oldValue) => {
2028
2044
  if (oldValue) {
2029
- observer.unobserve(refElement(oldValue));
2045
+ observer.unobserve(oldValue);
2030
2046
  contentRect.value = undefined;
2031
2047
  }
2032
- if (newValue) observer.observe(refElement(newValue));
2048
+ if (newValue) observer.observe(newValue);
2033
2049
  }, {
2034
2050
  flush: 'post'
2035
2051
  });
@@ -7621,7 +7637,7 @@
7621
7637
  const goTo = useGoTo();
7622
7638
  const goToOptions = vue.computed(() => {
7623
7639
  return {
7624
- container: containerRef.value,
7640
+ container: containerRef.el,
7625
7641
  duration: 200,
7626
7642
  easing: 'easeOutQuart'
7627
7643
  };
@@ -7645,9 +7661,9 @@
7645
7661
  contentSize.value = contentRect.value[sizeProperty];
7646
7662
  isOverflowing.value = containerSize.value + 1 < contentSize.value;
7647
7663
  }
7648
- if (firstSelectedIndex.value >= 0 && contentRef.value) {
7664
+ if (firstSelectedIndex.value >= 0 && contentRef.el) {
7649
7665
  // TODO: Is this too naive? Should we store element references in group composable?
7650
- const selectedElement = contentRef.value.children[lastSelectedIndex.value];
7666
+ const selectedElement = contentRef.el.children[lastSelectedIndex.value];
7651
7667
  scrollToChildren(selectedElement, props.centerActive);
7652
7668
  }
7653
7669
  });
@@ -7658,13 +7674,13 @@
7658
7674
  let target = 0;
7659
7675
  if (center) {
7660
7676
  target = calculateCenteredTarget({
7661
- containerElement: containerRef.value,
7677
+ containerElement: containerRef.el,
7662
7678
  isHorizontal: isHorizontal.value,
7663
7679
  selectedElement: children
7664
7680
  });
7665
7681
  } else {
7666
7682
  target = calculateUpdatedTarget({
7667
- containerElement: containerRef.value,
7683
+ containerElement: containerRef.el,
7668
7684
  isHorizontal: isHorizontal.value,
7669
7685
  isRtl: isRtl.value,
7670
7686
  selectedElement: children
@@ -7673,18 +7689,18 @@
7673
7689
  scrollToPosition(target);
7674
7690
  }
7675
7691
  function scrollToPosition(newPosition) {
7676
- if (!IN_BROWSER || !containerRef.value) return;
7677
- const offsetSize = getOffsetSize(isHorizontal.value, containerRef.value);
7678
- const scrollPosition = getScrollPosition(isHorizontal.value, isRtl.value, containerRef.value);
7679
- const scrollSize = getScrollSize(isHorizontal.value, containerRef.value);
7692
+ if (!IN_BROWSER || !containerRef.el) return;
7693
+ const offsetSize = getOffsetSize(isHorizontal.value, containerRef.el);
7694
+ const scrollPosition = getScrollPosition(isHorizontal.value, isRtl.value, containerRef.el);
7695
+ const scrollSize = getScrollSize(isHorizontal.value, containerRef.el);
7680
7696
  if (scrollSize <= offsetSize ||
7681
7697
  // Prevent scrolling by only a couple of pixels, which doesn't look smooth
7682
7698
  Math.abs(newPosition - scrollPosition) < 16) return;
7683
- if (isHorizontal.value && isRtl.value && containerRef.value) {
7699
+ if (isHorizontal.value && isRtl.value && containerRef.el) {
7684
7700
  const {
7685
7701
  scrollWidth,
7686
7702
  offsetWidth: containerWidth
7687
- } = containerRef.value;
7703
+ } = containerRef.el;
7688
7704
  newPosition = scrollWidth - containerWidth - newPosition;
7689
7705
  }
7690
7706
  if (isHorizontal.value) {
@@ -7702,12 +7718,12 @@
7702
7718
  }
7703
7719
  function onFocusin(e) {
7704
7720
  isFocused.value = true;
7705
- if (!isOverflowing.value || !contentRef.value) return;
7721
+ if (!isOverflowing.value || !contentRef.el) return;
7706
7722
 
7707
7723
  // Focused element is likely to be the root of an item, so a
7708
7724
  // breadth-first search will probably find it in the first iteration
7709
7725
  for (const el of e.composedPath()) {
7710
- for (const item of contentRef.value.children) {
7726
+ for (const item of contentRef.el.children) {
7711
7727
  if (item === el) {
7712
7728
  scrollToChildren(item);
7713
7729
  return;
@@ -7722,14 +7738,14 @@
7722
7738
  // Affix clicks produce onFocus that we have to ignore to avoid extra scrollToChildren
7723
7739
  let ignoreFocusEvent = false;
7724
7740
  function onFocus(e) {
7725
- if (!ignoreFocusEvent && !isFocused.value && !(e.relatedTarget && contentRef.value?.contains(e.relatedTarget))) focus();
7741
+ if (!ignoreFocusEvent && !isFocused.value && !(e.relatedTarget && contentRef.el?.contains(e.relatedTarget))) focus();
7726
7742
  ignoreFocusEvent = false;
7727
7743
  }
7728
7744
  function onFocusAffixes() {
7729
7745
  ignoreFocusEvent = true;
7730
7746
  }
7731
7747
  function onKeydown(e) {
7732
- if (!contentRef.value) return;
7748
+ if (!contentRef.el) return;
7733
7749
  function toFocus(location) {
7734
7750
  e.preventDefault();
7735
7751
  focus(location);
@@ -7754,21 +7770,21 @@
7754
7770
  }
7755
7771
  }
7756
7772
  function focus(location) {
7757
- if (!contentRef.value) return;
7773
+ if (!contentRef.el) return;
7758
7774
  let el;
7759
7775
  if (!location) {
7760
- const focusable = focusableChildren(contentRef.value);
7776
+ const focusable = focusableChildren(contentRef.el);
7761
7777
  el = focusable[0];
7762
7778
  } else if (location === 'next') {
7763
- el = contentRef.value.querySelector(':focus')?.nextElementSibling;
7779
+ el = contentRef.el.querySelector(':focus')?.nextElementSibling;
7764
7780
  if (!el) return focus('first');
7765
7781
  } else if (location === 'prev') {
7766
- el = contentRef.value.querySelector(':focus')?.previousElementSibling;
7782
+ el = contentRef.el.querySelector(':focus')?.previousElementSibling;
7767
7783
  if (!el) return focus('last');
7768
7784
  } else if (location === 'first') {
7769
- el = contentRef.value.firstElementChild;
7785
+ el = contentRef.el.firstElementChild;
7770
7786
  } else if (location === 'last') {
7771
- el = contentRef.value.lastElementChild;
7787
+ el = contentRef.el.lastElementChild;
7772
7788
  }
7773
7789
  if (el) {
7774
7790
  el.focus({
@@ -7782,11 +7798,11 @@
7782
7798
  let newPosition = scrollOffset.value + offsetStep;
7783
7799
 
7784
7800
  // TODO: improve it
7785
- if (isHorizontal.value && isRtl.value && containerRef.value) {
7801
+ if (isHorizontal.value && isRtl.value && containerRef.el) {
7786
7802
  const {
7787
7803
  scrollWidth,
7788
7804
  offsetWidth: containerWidth
7789
- } = containerRef.value;
7805
+ } = containerRef.el;
7790
7806
  newPosition += scrollWidth - containerWidth;
7791
7807
  }
7792
7808
  scrollToPosition(newPosition);
@@ -7829,8 +7845,8 @@
7829
7845
  });
7830
7846
  const hasNext = vue.computed(() => {
7831
7847
  if (!containerRef.value) return false;
7832
- const scrollSize = getScrollSize(isHorizontal.value, containerRef.value);
7833
- const clientSize = getClientSize(isHorizontal.value, containerRef.value);
7848
+ const scrollSize = getScrollSize(isHorizontal.value, containerRef.el);
7849
+ const clientSize = getClientSize(isHorizontal.value, containerRef.el);
7834
7850
  const scrollSizeMax = scrollSize - clientSize;
7835
7851
 
7836
7852
  // 1 pixel in reserve, may be lost after rounding
@@ -8254,14 +8270,16 @@
8254
8270
  },
8255
8271
  in: (v, children, parents) => {
8256
8272
  let set = new Set();
8257
- for (const id of v || []) {
8258
- set = strategy.activate({
8259
- id,
8260
- value: true,
8261
- activated: new Set(set),
8262
- children,
8263
- parents
8264
- });
8273
+ if (v != null) {
8274
+ for (const id of wrapInArray(v)) {
8275
+ set = strategy.activate({
8276
+ id,
8277
+ value: true,
8278
+ activated: new Set(set),
8279
+ children,
8280
+ parents
8281
+ });
8282
+ }
8265
8283
  }
8266
8284
  return set;
8267
8285
  },
@@ -8290,8 +8308,11 @@
8290
8308
  },
8291
8309
  in: (v, children, parents) => {
8292
8310
  let set = new Set();
8293
- if (v?.length) {
8294
- set = parentStrategy.in(v.slice(0, 1), children, parents);
8311
+ if (v != null) {
8312
+ const arr = wrapInArray(v);
8313
+ if (arr.length) {
8314
+ set = parentStrategy.in(arr.slice(0, 1), children, parents);
8315
+ }
8295
8316
  }
8296
8317
  return set;
8297
8318
  },
@@ -8635,12 +8656,12 @@
8635
8656
  const makeNestedProps = propsFactory({
8636
8657
  activatable: Boolean,
8637
8658
  selectable: Boolean,
8638
- activeStrategy: [String, Function],
8639
- selectStrategy: [String, Function],
8659
+ activeStrategy: [String, Function, Object],
8660
+ selectStrategy: [String, Function, Object],
8640
8661
  openStrategy: [String, Object],
8641
- opened: Array,
8642
- activated: Array,
8643
- selected: Array,
8662
+ opened: null,
8663
+ activated: null,
8664
+ selected: null,
8644
8665
  mandatory: Boolean
8645
8666
  }, 'nested');
8646
8667
  const useNested = props => {
@@ -8650,6 +8671,7 @@
8650
8671
  const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]);
8651
8672
  const activeStrategy = vue.computed(() => {
8652
8673
  if (typeof props.activeStrategy === 'object') return props.activeStrategy;
8674
+ if (typeof props.activeStrategy === 'function') return props.activeStrategy(props.mandatory);
8653
8675
  switch (props.activeStrategy) {
8654
8676
  case 'leaf':
8655
8677
  return leafActiveStrategy(props.mandatory);
@@ -8664,6 +8686,7 @@
8664
8686
  });
8665
8687
  const selectStrategy = vue.computed(() => {
8666
8688
  if (typeof props.selectStrategy === 'object') return props.selectStrategy;
8689
+ if (typeof props.selectStrategy === 'function') return props.selectStrategy(props.mandatory);
8667
8690
  switch (props.selectStrategy) {
8668
8691
  case 'single-leaf':
8669
8692
  return leafSingleSelectStrategy(props.mandatory);
@@ -10564,17 +10587,17 @@
10564
10587
  }, {
10565
10588
  flush: 'post'
10566
10589
  });
10567
- const activatorRef = vue.ref();
10590
+ const activatorRef = templateRef();
10568
10591
  vue.watchEffect(() => {
10569
10592
  if (!activatorRef.value) return;
10570
10593
  vue.nextTick(() => {
10571
- activatorEl.value = refElement(activatorRef.value);
10594
+ activatorEl.value = activatorRef.el;
10572
10595
  });
10573
10596
  });
10574
- const targetRef = vue.ref();
10597
+ const targetRef = templateRef();
10575
10598
  const target = vue.computed(() => {
10576
10599
  if (props.target === 'cursor' && cursorTarget.value) return cursorTarget.value;
10577
- if (targetRef.value) return refElement(targetRef.value);
10600
+ if (targetRef.value) return targetRef.el;
10578
10601
  return getTarget(props.target, vm) || activatorEl.value;
10579
10602
  });
10580
10603
  const targetEl = vue.computed(() => {
@@ -15043,7 +15066,7 @@
15043
15066
  const {
15044
15067
  resizeRef
15045
15068
  } = useResizeObserver(entries => {
15046
- if (!resizeRef.value?.offsetParent) return;
15069
+ if (!resizeRef.el?.offsetParent) return;
15047
15070
  const {
15048
15071
  width,
15049
15072
  height
@@ -18666,6 +18689,7 @@
18666
18689
  });
18667
18690
  return !!items.length && isSelected(items);
18668
18691
  });
18692
+ const showSelectAll = vue.computed(() => selectStrategy.value.showSelectAll);
18669
18693
  const data = {
18670
18694
  toggleSelect,
18671
18695
  select,
@@ -18674,7 +18698,7 @@
18674
18698
  isSomeSelected,
18675
18699
  someSelected,
18676
18700
  allSelected,
18677
- showSelectAll: selectStrategy.value.showSelectAll
18701
+ showSelectAll
18678
18702
  };
18679
18703
  vue.provide(VDataTableSelectionSymbol, data);
18680
18704
  return data;
@@ -19945,7 +19969,7 @@
19945
19969
  };
19946
19970
  if (slots[columnSlotName]) return slots[columnSlotName](columnSlotProps);
19947
19971
  if (column.key === 'data-table-select') {
19948
- return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll && vue.createVNode(VCheckboxBtn, {
19972
+ return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && vue.createVNode(VCheckboxBtn, {
19949
19973
  "modelValue": allSelected.value,
19950
19974
  "indeterminate": someSelected.value && !allSelected.value,
19951
19975
  "onUpdate:modelValue": selectAll
@@ -21914,10 +21938,10 @@
21914
21938
  vue.watchEffect(() => {
21915
21939
  model.value = model.value ?? adapter.getYear(adapter.date());
21916
21940
  });
21917
- const yearRef = vue.ref();
21941
+ const yearRef = templateRef();
21918
21942
  vue.onMounted(async () => {
21919
21943
  await vue.nextTick();
21920
- yearRef.value?.$el.scrollIntoView({
21944
+ yearRef.el?.scrollIntoView({
21921
21945
  block: 'center'
21922
21946
  });
21923
21947
  });
@@ -23243,7 +23267,7 @@
23243
23267
  function intersecting(side) {
23244
23268
  if (props.mode !== 'manual' && !isIntersecting.value) return;
23245
23269
  const status = getStatus(side);
23246
- if (!rootEl.value || status === 'loading') return;
23270
+ if (!rootEl.value || ['empty', 'loading'].includes(status)) return;
23247
23271
  previousScrollSize = getScrollSize();
23248
23272
  setStatus(side, 'loading');
23249
23273
  function done(status) {
@@ -26138,7 +26162,8 @@
26138
26162
  }, windowProps, {
26139
26163
  "modelValue": model.value,
26140
26164
  "onUpdate:modelValue": $event => model.value = $event,
26141
- "class": "v-stepper-window",
26165
+ "class": ['v-stepper-window', props.class],
26166
+ "style": props.style,
26142
26167
  "mandatory": false,
26143
26168
  "touch": false
26144
26169
  }), slots);
@@ -26162,7 +26187,8 @@
26162
26187
  return vue.createVNode(VWindowItem, vue.mergeProps({
26163
26188
  "_as": "VStepperWindowItem"
26164
26189
  }, windowItemProps, {
26165
- "class": "v-stepper-window-item"
26190
+ "class": ['v-stepper-window-item', props.class],
26191
+ "style": props.style
26166
26192
  }), slots);
26167
26193
  });
26168
26194
  return {};
@@ -26661,7 +26687,8 @@
26661
26687
  }, windowProps, {
26662
26688
  "modelValue": model.value,
26663
26689
  "onUpdate:modelValue": $event => model.value = $event,
26664
- "class": "v-tabs-window",
26690
+ "class": ['v-tabs-window', props.class],
26691
+ "style": props.style,
26665
26692
  "mandatory": false,
26666
26693
  "touch": false
26667
26694
  }), slots);
@@ -27930,7 +27957,7 @@
27930
27957
  goTo
27931
27958
  };
27932
27959
  }
27933
- const version$1 = "3.6.3-master.2024-05-07";
27960
+ const version$1 = "3.6.4-master.2024-05-08";
27934
27961
  createVuetify$1.version = version$1;
27935
27962
 
27936
27963
  // Vue's inject() can only be used in setup
@@ -27955,7 +27982,7 @@
27955
27982
  ...options
27956
27983
  });
27957
27984
  };
27958
- const version = "3.6.3-master.2024-05-07";
27985
+ const version = "3.6.4-master.2024-05-08";
27959
27986
  createVuetify.version = version;
27960
27987
 
27961
27988
  exports.blueprints = index;