jquery-ui-rails 3.0.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of jquery-ui-rails might be problematic. Click here for more details.

Files changed (61) hide show
  1. data/History.md +10 -0
  2. data/README.md +1 -1
  3. data/Rakefile +4 -5
  4. data/lib/jquery/ui/rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/jquery.ui.accordion.js +130 -290
  6. data/vendor/assets/javascripts/jquery.ui.autocomplete.js +30 -18
  7. data/vendor/assets/javascripts/jquery.ui.button.js +9 -8
  8. data/vendor/assets/javascripts/jquery.ui.core.js +19 -53
  9. data/vendor/assets/javascripts/jquery.ui.datepicker-be.js +23 -0
  10. data/vendor/assets/javascripts/jquery.ui.datepicker-fr-CA.js +23 -0
  11. data/vendor/assets/javascripts/jquery.ui.datepicker-ky.js +24 -0
  12. data/vendor/assets/javascripts/jquery.ui.datepicker-nb.js +22 -0
  13. data/vendor/assets/javascripts/jquery.ui.datepicker-nn.js +22 -0
  14. data/vendor/assets/javascripts/jquery.ui.datepicker.js +1076 -878
  15. data/vendor/assets/javascripts/jquery.ui.dialog.js +456 -547
  16. data/vendor/assets/javascripts/jquery.ui.draggable.js +317 -207
  17. data/vendor/assets/javascripts/jquery.ui.droppable.js +177 -100
  18. data/vendor/assets/javascripts/jquery.ui.effect-blind.js +2 -2
  19. data/vendor/assets/javascripts/jquery.ui.effect-bounce.js +2 -2
  20. data/vendor/assets/javascripts/jquery.ui.effect-clip.js +2 -2
  21. data/vendor/assets/javascripts/jquery.ui.effect-drop.js +2 -2
  22. data/vendor/assets/javascripts/jquery.ui.effect-explode.js +2 -2
  23. data/vendor/assets/javascripts/jquery.ui.effect-fade.js +2 -2
  24. data/vendor/assets/javascripts/jquery.ui.effect-fold.js +2 -2
  25. data/vendor/assets/javascripts/jquery.ui.effect-highlight.js +2 -2
  26. data/vendor/assets/javascripts/jquery.ui.effect-pulsate.js +2 -2
  27. data/vendor/assets/javascripts/jquery.ui.effect-scale.js +2 -2
  28. data/vendor/assets/javascripts/jquery.ui.effect-shake.js +2 -2
  29. data/vendor/assets/javascripts/jquery.ui.effect-slide.js +2 -2
  30. data/vendor/assets/javascripts/jquery.ui.effect-transfer.js +3 -3
  31. data/vendor/assets/javascripts/jquery.ui.effect.js +91 -99
  32. data/vendor/assets/javascripts/jquery.ui.menu.js +20 -9
  33. data/vendor/assets/javascripts/jquery.ui.mouse.js +25 -25
  34. data/vendor/assets/javascripts/jquery.ui.position.js +39 -59
  35. data/vendor/assets/javascripts/jquery.ui.progressbar.js +73 -33
  36. data/vendor/assets/javascripts/jquery.ui.resizable.js +461 -294
  37. data/vendor/assets/javascripts/jquery.ui.selectable.js +67 -51
  38. data/vendor/assets/javascripts/jquery.ui.slider.js +100 -95
  39. data/vendor/assets/javascripts/jquery.ui.sortable.js +411 -257
  40. data/vendor/assets/javascripts/jquery.ui.spinner.js +19 -5
  41. data/vendor/assets/javascripts/jquery.ui.tabs.js +47 -567
  42. data/vendor/assets/javascripts/jquery.ui.tooltip.js +14 -10
  43. data/vendor/assets/javascripts/jquery.ui.widget.js +33 -40
  44. data/vendor/assets/stylesheets/jquery.ui.accordion.css.erb +30 -8
  45. data/vendor/assets/stylesheets/jquery.ui.all.css.erb +2 -2
  46. data/vendor/assets/stylesheets/jquery.ui.autocomplete.css.erb +2 -5
  47. data/vendor/assets/stylesheets/jquery.ui.base.css.erb +2 -2
  48. data/vendor/assets/stylesheets/jquery.ui.button.css.erb +100 -26
  49. data/vendor/assets/stylesheets/jquery.ui.core.css.erb +65 -12
  50. data/vendor/assets/stylesheets/jquery.ui.datepicker.css.erb +166 -55
  51. data/vendor/assets/stylesheets/jquery.ui.dialog.css.erb +61 -14
  52. data/vendor/assets/stylesheets/jquery.ui.menu.css.erb +61 -14
  53. data/vendor/assets/stylesheets/jquery.ui.progressbar.css.erb +20 -4
  54. data/vendor/assets/stylesheets/jquery.ui.resizable.css.erb +70 -13
  55. data/vendor/assets/stylesheets/jquery.ui.selectable.css.erb +7 -3
  56. data/vendor/assets/stylesheets/jquery.ui.slider.css.erb +63 -15
  57. data/vendor/assets/stylesheets/jquery.ui.spinner.css.erb +52 -10
  58. data/vendor/assets/stylesheets/jquery.ui.tabs.css.erb +44 -10
  59. data/vendor/assets/stylesheets/jquery.ui.theme.css.erb +196 -38
  60. data/vendor/assets/stylesheets/jquery.ui.tooltip.css.erb +4 -6
  61. metadata +8 -3
data/History.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # master
2
2
 
3
+ # 4.0.0
4
+
5
+ * Upgrade to jQuery UI 1.10.0
6
+
7
+ * No more automatic `//= require jquery`
8
+ ([#30](https://github.com/joliss/jquery-ui-rails/pull/30), original
9
+ discussion at [#17](https://github.com/joliss/jquery-ui-rails/pull/17)).
10
+ This means that you have to add `//= require jquery` to your application.js
11
+ file before you require any of the jQuery UI JavaScript modules.
12
+
3
13
  # 3.0.1
4
14
 
5
15
  * Fix stylesheet dependencies
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/joliss/jquery-ui-rails.png?branch=master)](http://travis-ci.org/joliss/jquery-ui-rails) [![Dependency Status](https://gemnasium.com/joliss/jquery-ui-rails.png)](https://gemnasium.com/joliss/jquery-ui-rails)
4
4
 
5
- This gem packages the jQuery UI 1.9.2 assets (JavaScripts, stylesheets, and
5
+ This gem packages the jQuery UI 1.10.0 assets (JavaScripts, stylesheets, and
6
6
  images) for the Rails 3.1+ [asset
7
7
  pipeline](http://guides.rubyonrails.org/asset_pipeline.html), so you never have
8
8
  to download a custom package through the [web
data/Rakefile CHANGED
@@ -40,10 +40,9 @@ def map_dependencies
40
40
 
41
41
  deps = build_info['dependencies'].keys
42
42
 
43
- # jquery.ui.core.js (and only it) should depend on jquery.js itself,
44
- # so we remove 'jquery' from the list of dependencies for all files except
45
- # jquery.ui.core.js
46
- deps.reject! {|d| d == "jquery" } unless source_file_name == 'jquery.ui.core.js'
43
+ # None of jquery.ui files should depend on jquery.js,
44
+ # so we remove 'jquery' from the list of dependencies for all files
45
+ deps.reject! {|d| d == "jquery" }
47
46
 
48
47
  deps.map! {|d| source_file_for_dependency_entry d }
49
48
 
@@ -70,7 +69,7 @@ def get_js_dependencies(basename)
70
69
  end
71
70
  # Make sure we do not package assets with broken dependencies
72
71
  dependencies.each do |dep|
73
- unless dep == "jquery.js" || File.exist?("jquery-ui/ui/#{dep}")
72
+ unless File.exist?("jquery-ui/ui/#{dep}")
74
73
  fail "#{basename}: missing #{dep}"
75
74
  end
76
75
  end
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Ui
3
3
  module Rails
4
- VERSION = "3.0.1"
4
+ VERSION = "4.0.0"
5
5
  end
6
6
  end
7
7
  end
@@ -2,10 +2,10 @@
2
2
  //= require jquery.ui.widget
3
3
 
4
4
  /*!
5
- * jQuery UI Accordion 1.9.2
5
+ * jQuery UI Accordion 1.10.0
6
6
  * http://jqueryui.com
7
7
  *
8
- * Copyright 2012 jQuery Foundation and other contributors
8
+ * Copyright 2013 jQuery Foundation and other contributors
9
9
  * Released under the MIT license.
10
10
  * http://jquery.org/license
11
11
  *
@@ -27,7 +27,7 @@ showProps.height = showProps.paddingTop = showProps.paddingBottom =
27
27
  showProps.borderTopWidth = showProps.borderBottomWidth = "show";
28
28
 
29
29
  $.widget( "ui.accordion", {
30
- version: "1.9.2",
30
+ version: "1.10.0",
31
31
  options: {
32
32
  active: 0,
33
33
  animate: {},
@@ -46,95 +46,23 @@ $.widget( "ui.accordion", {
46
46
  },
47
47
 
48
48
  _create: function() {
49
- var accordionId = this.accordionId = "ui-accordion-" +
50
- (this.element.attr( "id" ) || ++uid),
51
- options = this.options;
52
-
49
+ var options = this.options;
53
50
  this.prevShow = this.prevHide = $();
54
- this.element.addClass( "ui-accordion ui-widget ui-helper-reset" );
55
-
56
- this.headers = this.element.find( options.header )
57
- .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
58
- this._hoverable( this.headers );
59
- this._focusable( this.headers );
60
-
61
- this.headers.next()
62
- .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
63
- .hide();
51
+ this.element.addClass( "ui-accordion ui-widget ui-helper-reset" )
52
+ // ARIA
53
+ .attr( "role", "tablist" );
64
54
 
65
55
  // don't allow collapsible: false and active: false / null
66
56
  if ( !options.collapsible && (options.active === false || options.active == null) ) {
67
57
  options.active = 0;
68
58
  }
59
+
60
+ this._processPanels();
69
61
  // handle negative values
70
62
  if ( options.active < 0 ) {
71
63
  options.active += this.headers.length;
72
64
  }
73
- this.active = this._findActive( options.active )
74
- .addClass( "ui-accordion-header-active ui-state-active" )
75
- .toggleClass( "ui-corner-all ui-corner-top" );
76
- this.active.next()
77
- .addClass( "ui-accordion-content-active" )
78
- .show();
79
-
80
- this._createIcons();
81
- this.refresh();
82
-
83
- // ARIA
84
- this.element.attr( "role", "tablist" );
85
-
86
- this.headers
87
- .attr( "role", "tab" )
88
- .each(function( i ) {
89
- var header = $( this ),
90
- headerId = header.attr( "id" ),
91
- panel = header.next(),
92
- panelId = panel.attr( "id" );
93
- if ( !headerId ) {
94
- headerId = accordionId + "-header-" + i;
95
- header.attr( "id", headerId );
96
- }
97
- if ( !panelId ) {
98
- panelId = accordionId + "-panel-" + i;
99
- panel.attr( "id", panelId );
100
- }
101
- header.attr( "aria-controls", panelId );
102
- panel.attr( "aria-labelledby", headerId );
103
- })
104
- .next()
105
- .attr( "role", "tabpanel" );
106
-
107
- this.headers
108
- .not( this.active )
109
- .attr({
110
- "aria-selected": "false",
111
- tabIndex: -1
112
- })
113
- .next()
114
- .attr({
115
- "aria-expanded": "false",
116
- "aria-hidden": "true"
117
- })
118
- .hide();
119
-
120
- // make sure at least one header is in the tab order
121
- if ( !this.active.length ) {
122
- this.headers.eq( 0 ).attr( "tabIndex", 0 );
123
- } else {
124
- this.active.attr({
125
- "aria-selected": "true",
126
- tabIndex: 0
127
- })
128
- .next()
129
- .attr({
130
- "aria-expanded": "true",
131
- "aria-hidden": "false"
132
- });
133
- }
134
-
135
- this._on( this.headers, { keydown: "_keydown" });
136
- this._on( this.headers.next(), { keydown: "_panelKeyDown" });
137
- this._setupEvents( options.event );
65
+ this._refresh();
138
66
  },
139
67
 
140
68
  _getCreateEventData: function() {
@@ -241,6 +169,7 @@ $.widget( "ui.accordion", {
241
169
  },
242
170
 
243
171
  _keydown: function( event ) {
172
+ /*jshint maxcomplexity:15*/
244
173
  if ( event.altKey || event.ctrlKey ) {
245
174
  return;
246
175
  }
@@ -286,20 +215,116 @@ $.widget( "ui.accordion", {
286
215
  },
287
216
 
288
217
  refresh: function() {
289
- var maxHeight, overflow,
290
- heightStyle = this.options.heightStyle,
291
- parent = this.element.parent();
218
+ var options = this.options;
219
+ this._processPanels();
220
+
221
+ // was collapsed or no panel
222
+ if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {
223
+ options.active = false;
224
+ this.active = $();
225
+ // active false only when collapsible is true
226
+ } if ( options.active === false ) {
227
+ this._activate( 0 );
228
+ // was active, but active panel is gone
229
+ } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
230
+ // all remaining panel are disabled
231
+ if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) {
232
+ options.active = false;
233
+ this.active = $();
234
+ // activate previous panel
235
+ } else {
236
+ this._activate( Math.max( 0, options.active - 1 ) );
237
+ }
238
+ // was active, active panel still exists
239
+ } else {
240
+ // make sure active index is correct
241
+ options.active = this.headers.index( this.active );
242
+ }
243
+
244
+ this._destroyIcons();
245
+
246
+ this._refresh();
247
+ },
248
+
249
+ _processPanels: function() {
250
+ this.headers = this.element.find( this.options.header )
251
+ .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
292
252
 
253
+ this.headers.next()
254
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
255
+ .filter(":not(.ui-accordion-content-active)")
256
+ .hide();
257
+ },
258
+
259
+ _refresh: function() {
260
+ var maxHeight,
261
+ options = this.options,
262
+ heightStyle = options.heightStyle,
263
+ parent = this.element.parent(),
264
+ accordionId = this.accordionId = "ui-accordion-" +
265
+ (this.element.attr( "id" ) || ++uid);
266
+
267
+ this.active = this._findActive( options.active )
268
+ .addClass( "ui-accordion-header-active ui-state-active" )
269
+ .toggleClass( "ui-corner-all ui-corner-top" );
270
+ this.active.next()
271
+ .addClass( "ui-accordion-content-active" )
272
+ .show();
273
+
274
+ this.headers
275
+ .attr( "role", "tab" )
276
+ .each(function( i ) {
277
+ var header = $( this ),
278
+ headerId = header.attr( "id" ),
279
+ panel = header.next(),
280
+ panelId = panel.attr( "id" );
281
+ if ( !headerId ) {
282
+ headerId = accordionId + "-header-" + i;
283
+ header.attr( "id", headerId );
284
+ }
285
+ if ( !panelId ) {
286
+ panelId = accordionId + "-panel-" + i;
287
+ panel.attr( "id", panelId );
288
+ }
289
+ header.attr( "aria-controls", panelId );
290
+ panel.attr( "aria-labelledby", headerId );
291
+ })
292
+ .next()
293
+ .attr( "role", "tabpanel" );
294
+
295
+ this.headers
296
+ .not( this.active )
297
+ .attr({
298
+ "aria-selected": "false",
299
+ tabIndex: -1
300
+ })
301
+ .next()
302
+ .attr({
303
+ "aria-expanded": "false",
304
+ "aria-hidden": "true"
305
+ })
306
+ .hide();
307
+
308
+ // make sure at least one header is in the tab order
309
+ if ( !this.active.length ) {
310
+ this.headers.eq( 0 ).attr( "tabIndex", 0 );
311
+ } else {
312
+ this.active.attr({
313
+ "aria-selected": "true",
314
+ tabIndex: 0
315
+ })
316
+ .next()
317
+ .attr({
318
+ "aria-expanded": "true",
319
+ "aria-hidden": "false"
320
+ });
321
+ }
322
+
323
+ this._createIcons();
324
+
325
+ this._setupEvents( options.event );
293
326
 
294
327
  if ( heightStyle === "fill" ) {
295
- // IE 6 treats height like minHeight, so we need to turn off overflow
296
- // in order to get a reliable height
297
- // we use the minHeight support test because we assume that only
298
- // browsers that don't support minHeight will treat height as minHeight
299
- if ( !$.support.minHeight ) {
300
- overflow = parent.css( "overflow" );
301
- parent.css( "overflow", "hidden");
302
- }
303
328
  maxHeight = parent.height();
304
329
  this.element.siblings( ":visible" ).each(function() {
305
330
  var elem = $( this ),
@@ -310,9 +335,6 @@ $.widget( "ui.accordion", {
310
335
  }
311
336
  maxHeight -= elem.outerHeight( true );
312
337
  });
313
- if ( overflow ) {
314
- parent.css( "overflow", overflow );
315
- }
316
338
 
317
339
  this.headers.each(function() {
318
340
  maxHeight -= $( this ).outerHeight( true );
@@ -357,14 +379,20 @@ $.widget( "ui.accordion", {
357
379
  },
358
380
 
359
381
  _setupEvents: function( event ) {
360
- var events = {};
361
- if ( !event ) {
362
- return;
382
+ var events = {
383
+ keydown: "_keydown"
384
+ };
385
+ if ( event ) {
386
+ $.each( event.split(" "), function( index, eventName ) {
387
+ events[ eventName ] = "_eventHandler";
388
+ });
363
389
  }
364
- $.each( event.split(" "), function( index, eventName ) {
365
- events[ eventName ] = "_eventHandler";
366
- });
390
+
391
+ this._off( this.headers.add( this.headers.next() ) );
367
392
  this._on( this.headers, events );
393
+ this._on( this.headers.next(), { keydown: "_panelKeyDown" });
394
+ this._hoverable( this.headers );
395
+ this._focusable( this.headers );
368
396
  },
369
397
 
370
398
  _eventHandler: function( event ) {
@@ -543,192 +571,4 @@ $.widget( "ui.accordion", {
543
571
  }
544
572
  });
545
573
 
546
-
547
-
548
- // DEPRECATED
549
- if ( $.uiBackCompat !== false ) {
550
- // navigation options
551
- (function( $, prototype ) {
552
- $.extend( prototype.options, {
553
- navigation: false,
554
- navigationFilter: function() {
555
- return this.href.toLowerCase() === location.href.toLowerCase();
556
- }
557
- });
558
-
559
- var _create = prototype._create;
560
- prototype._create = function() {
561
- if ( this.options.navigation ) {
562
- var that = this,
563
- headers = this.element.find( this.options.header ),
564
- content = headers.next(),
565
- current = headers.add( content )
566
- .find( "a" )
567
- .filter( this.options.navigationFilter )
568
- [ 0 ];
569
- if ( current ) {
570
- headers.add( content ).each( function( index ) {
571
- if ( $.contains( this, current ) ) {
572
- that.options.active = Math.floor( index / 2 );
573
- return false;
574
- }
575
- });
576
- }
577
- }
578
- _create.call( this );
579
- };
580
- }( jQuery, jQuery.ui.accordion.prototype ) );
581
-
582
- // height options
583
- (function( $, prototype ) {
584
- $.extend( prototype.options, {
585
- heightStyle: null, // remove default so we fall back to old values
586
- autoHeight: true, // use heightStyle: "auto"
587
- clearStyle: false, // use heightStyle: "content"
588
- fillSpace: false // use heightStyle: "fill"
589
- });
590
-
591
- var _create = prototype._create,
592
- _setOption = prototype._setOption;
593
-
594
- $.extend( prototype, {
595
- _create: function() {
596
- this.options.heightStyle = this.options.heightStyle ||
597
- this._mergeHeightStyle();
598
-
599
- _create.call( this );
600
- },
601
-
602
- _setOption: function( key ) {
603
- if ( key === "autoHeight" || key === "clearStyle" || key === "fillSpace" ) {
604
- this.options.heightStyle = this._mergeHeightStyle();
605
- }
606
- _setOption.apply( this, arguments );
607
- },
608
-
609
- _mergeHeightStyle: function() {
610
- var options = this.options;
611
-
612
- if ( options.fillSpace ) {
613
- return "fill";
614
- }
615
-
616
- if ( options.clearStyle ) {
617
- return "content";
618
- }
619
-
620
- if ( options.autoHeight ) {
621
- return "auto";
622
- }
623
- }
624
- });
625
- }( jQuery, jQuery.ui.accordion.prototype ) );
626
-
627
- // icon options
628
- (function( $, prototype ) {
629
- $.extend( prototype.options.icons, {
630
- activeHeader: null, // remove default so we fall back to old values
631
- headerSelected: "ui-icon-triangle-1-s"
632
- });
633
-
634
- var _createIcons = prototype._createIcons;
635
- prototype._createIcons = function() {
636
- if ( this.options.icons ) {
637
- this.options.icons.activeHeader = this.options.icons.activeHeader ||
638
- this.options.icons.headerSelected;
639
- }
640
- _createIcons.call( this );
641
- };
642
- }( jQuery, jQuery.ui.accordion.prototype ) );
643
-
644
- // expanded active option, activate method
645
- (function( $, prototype ) {
646
- prototype.activate = prototype._activate;
647
-
648
- var _findActive = prototype._findActive;
649
- prototype._findActive = function( index ) {
650
- if ( index === -1 ) {
651
- index = false;
652
- }
653
- if ( index && typeof index !== "number" ) {
654
- index = this.headers.index( this.headers.filter( index ) );
655
- if ( index === -1 ) {
656
- index = false;
657
- }
658
- }
659
- return _findActive.call( this, index );
660
- };
661
- }( jQuery, jQuery.ui.accordion.prototype ) );
662
-
663
- // resize method
664
- jQuery.ui.accordion.prototype.resize = jQuery.ui.accordion.prototype.refresh;
665
-
666
- // change events
667
- (function( $, prototype ) {
668
- $.extend( prototype.options, {
669
- change: null,
670
- changestart: null
671
- });
672
-
673
- var _trigger = prototype._trigger;
674
- prototype._trigger = function( type, event, data ) {
675
- var ret = _trigger.apply( this, arguments );
676
- if ( !ret ) {
677
- return false;
678
- }
679
-
680
- if ( type === "beforeActivate" ) {
681
- ret = _trigger.call( this, "changestart", event, {
682
- oldHeader: data.oldHeader,
683
- oldContent: data.oldPanel,
684
- newHeader: data.newHeader,
685
- newContent: data.newPanel
686
- });
687
- } else if ( type === "activate" ) {
688
- ret = _trigger.call( this, "change", event, {
689
- oldHeader: data.oldHeader,
690
- oldContent: data.oldPanel,
691
- newHeader: data.newHeader,
692
- newContent: data.newPanel
693
- });
694
- }
695
- return ret;
696
- };
697
- }( jQuery, jQuery.ui.accordion.prototype ) );
698
-
699
- // animated option
700
- // NOTE: this only provides support for "slide", "bounceslide", and easings
701
- // not the full $.ui.accordion.animations API
702
- (function( $, prototype ) {
703
- $.extend( prototype.options, {
704
- animate: null,
705
- animated: "slide"
706
- });
707
-
708
- var _create = prototype._create;
709
- prototype._create = function() {
710
- var options = this.options;
711
- if ( options.animate === null ) {
712
- if ( !options.animated ) {
713
- options.animate = false;
714
- } else if ( options.animated === "slide" ) {
715
- options.animate = 300;
716
- } else if ( options.animated === "bounceslide" ) {
717
- options.animate = {
718
- duration: 200,
719
- down: {
720
- easing: "easeOutBounce",
721
- duration: 1000
722
- }
723
- };
724
- } else {
725
- options.animate = options.animated;
726
- }
727
- }
728
-
729
- _create.call( this );
730
- };
731
- }( jQuery, jQuery.ui.accordion.prototype ) );
732
- }
733
-
734
574
  })( jQuery );