aboutsummaryrefslogtreecommitdiff
path: root/sources/plugins/dialog
diff options
context:
space:
mode:
authorIsmaël Bouya <ismael.bouya@normalesup.org>2017-12-04 17:54:04 +0100
committerIsmaël Bouya <ismael.bouya@normalesup.org>2017-12-04 17:54:04 +0100
commit317f8f8f0651488f226b5280a8f036c7c135c639 (patch)
tree97bd4889ab2822a00d4b0f0d5cde38b59f9f41de /sources/plugins/dialog
parent1096cdefb1c9a3f3c4ca6807e272da6c92e5ed9c (diff)
downloadpiedsjaloux-ckeditor-component-317f8f8f0651488f226b5280a8f036c7c135c639.tar.gz
piedsjaloux-ckeditor-component-317f8f8f0651488f226b5280a8f036c7c135c639.tar.zst
piedsjaloux-ckeditor-component-317f8f8f0651488f226b5280a8f036c7c135c639.zip
Add oembed4.7.3
Diffstat (limited to 'sources/plugins/dialog')
-rw-r--r--sources/plugins/dialog/dialogDefinition.js2
-rw-r--r--sources/plugins/dialog/plugin.js67
-rw-r--r--sources/plugins/dialog/samples/assets/my_dialog.js2
-rw-r--r--sources/plugins/dialog/samples/dialog.html4
4 files changed, 44 insertions, 31 deletions
diff --git a/sources/plugins/dialog/dialogDefinition.js b/sources/plugins/dialog/dialogDefinition.js
index df5870c..6ecb491 100644
--- a/sources/plugins/dialog/dialogDefinition.js
+++ b/sources/plugins/dialog/dialogDefinition.js
@@ -1,6 +1,6 @@
1// jscs:disable disallowMixedSpacesAndTabs 1// jscs:disable disallowMixedSpacesAndTabs
2/** 2/**
3 * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved. 3 * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
4 * For licensing, see LICENSE.md or http://ckeditor.com/license 4 * For licensing, see LICENSE.md or http://ckeditor.com/license
5 */ 5 */
6 6
diff --git a/sources/plugins/dialog/plugin.js b/sources/plugins/dialog/plugin.js
index 3afe887..f26f9c9 100644
--- a/sources/plugins/dialog/plugin.js
+++ b/sources/plugins/dialog/plugin.js
@@ -1,5 +1,5 @@
1/** 1/**
2 * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved. 2 * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license 3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */ 4 */
5 5
@@ -177,10 +177,10 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
177 title = body.getChild( 0 ), 177 title = body.getChild( 0 ),
178 close = body.getChild( 1 ); 178 close = body.getChild( 1 );
179 179
180 // Don't allow dragging on dialog (#13184). 180 // Don't allow dragging on dialog (http://dev.ckeditor.com/ticket/13184).
181 editor.plugins.clipboard && CKEDITOR.plugins.clipboard.preventDefaultDropOnElement( body ); 181 editor.plugins.clipboard && CKEDITOR.plugins.clipboard.preventDefaultDropOnElement( body );
182 182
183 // IFrame shim for dialog that masks activeX in IE. (#7619) 183 // IFrame shim for dialog that masks activeX in IE. (http://dev.ckeditor.com/ticket/7619)
184 if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks && !CKEDITOR.env.edge ) { 184 if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks && !CKEDITOR.env.edge ) {
185 var src = 'javascript:void(function(){' + encodeURIComponent( 'document.open();(' + CKEDITOR.tools.fixDomain + ')();document.close();' ) + '}())', // jshint ignore:line 185 var src = 'javascript:void(function(){' + encodeURIComponent( 'document.open();(' + CKEDITOR.tools.fixDomain + ')();document.close();' ) + '}())', // jshint ignore:line
186 iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' + 186 iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
@@ -229,7 +229,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
229 tabsToRemove = {}, 229 tabsToRemove = {},
230 i, processed, stopPropagation; 230 i, processed, stopPropagation;
231 231
232 if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) || // The buttons in MacOS Apps are in reverse order (#4750) 232 if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) || // The buttons in MacOS Apps are in reverse order (http://dev.ckeditor.com/ticket/4750)
233 ( buttonsOrder == 'rtl' && dir == 'ltr' ) || ( buttonsOrder == 'ltr' && dir == 'rtl' ) ) 233 ( buttonsOrder == 'rtl' && dir == 'ltr' ) || ( buttonsOrder == 'ltr' && dir == 'rtl' ) )
234 defaultDefinition.buttons.reverse(); 234 defaultDefinition.buttons.reverse();
235 235
@@ -334,7 +334,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
334 334
335 if ( definition.onOk ) { 335 if ( definition.onOk ) {
336 this.on( 'ok', function( evt ) { 336 this.on( 'ok', function( evt ) {
337 // Dialog confirm might probably introduce content changes (#5415). 337 // Dialog confirm might probably introduce content changes (http://dev.ckeditor.com/ticket/5415).
338 editor.fire( 'saveSnapshot' ); 338 editor.fire( 'saveSnapshot' );
339 setTimeout( function() { 339 setTimeout( function() {
340 editor.fire( 'saveSnapshot' ); 340 editor.fire( 'saveSnapshot' );
@@ -451,7 +451,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
451 currentIndex = currentIndex + offset; 451 currentIndex = currentIndex + offset;
452 452
453 if ( hasTabs && !me._.tabBarMode && ( currentIndex == focusList.length || currentIndex == -1 ) ) { 453 if ( hasTabs && !me._.tabBarMode && ( currentIndex == focusList.length || currentIndex == -1 ) ) {
454 // If the dialog was not in tab mode, then focus the first tab (#13027). 454 // If the dialog was not in tab mode, then focus the first tab (http://dev.ckeditor.com/ticket/13027).
455 me._.tabBarMode = true; 455 me._.tabBarMode = true;
456 me._.tabs[ me._.currentTabId ][ 0 ].focus(); 456 me._.tabs[ me._.currentTabId ][ 0 ].focus();
457 me._.currentFocusIndex = -1; 457 me._.currentFocusIndex = -1;
@@ -528,7 +528,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
528 button && CKEDITOR.tools.setTimeout( button.click, 0, button ); 528 button && CKEDITOR.tools.setTimeout( button.click, 0, button );
529 processed = 1; 529 processed = 1;
530 } 530 }
531 stopPropagation = 1; // Always block the propagation (#4269) 531 stopPropagation = 1; // Always block the propagation (http://dev.ckeditor.com/ticket/4269)
532 } else if ( keystroke == 27 /*ESC*/ ) { 532 } else if ( keystroke == 27 /*ESC*/ ) {
533 button = this.getButton( 'cancel' ); 533 button = this.getButton( 'cancel' );
534 534
@@ -539,7 +539,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
539 if ( this.fire( 'cancel', { hide: true } ).hide !== false ) 539 if ( this.fire( 'cancel', { hide: true } ).hide !== false )
540 this.hide(); 540 this.hide();
541 } 541 }
542 stopPropagation = 1; // Always block the propagation (#4269) 542 stopPropagation = 1; // Always block the propagation (http://dev.ckeditor.com/ticket/4269)
543 } else { 543 } else {
544 return; 544 return;
545 } 545 }
@@ -563,7 +563,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
563 dialogElement.on( 'keydown', keydownHandler, this ); 563 dialogElement.on( 'keydown', keydownHandler, this );
564 564
565 // Some browsers instead, don't cancel key events in the keydown, but in the 565 // Some browsers instead, don't cancel key events in the keydown, but in the
566 // keypress. So we must do a longer trip in those cases. (#4531,#8985) 566 // keypress. So we must do a longer trip in those cases. (http://dev.ckeditor.com/ticket/4531,http://dev.ckeditor.com/ticket/8985)
567 if ( CKEDITOR.env.gecko ) 567 if ( CKEDITOR.env.gecko )
568 dialogElement.on( 'keypress', keypressHandler, this ); 568 dialogElement.on( 'keypress', keypressHandler, this );
569 569
@@ -612,7 +612,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
612 } 612 }
613 }, this, null, 0xffffffff ); 613 }, this, null, 0xffffffff );
614 614
615 // IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (#2661). 615 // IE6 BUG: Text fields and text areas are only half-rendered the first time the dialog appears in IE6 (http://dev.ckeditor.com/ticket/2661).
616 // This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken. 616 // This is still needed after [2708] and [2709] because text fields in hidden TR tags are still broken.
617 if ( CKEDITOR.env.ie6Compat ) { 617 if ( CKEDITOR.env.ie6Compat ) {
618 this.on( 'load', function() { 618 this.on( 'load', function() {
@@ -788,7 +788,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
788 var element = this._.element.getFirst(), rtl = this._.editor.lang.dir == 'rtl'; 788 var element = this._.element.getFirst(), rtl = this._.editor.lang.dir == 'rtl';
789 var isFixed = element.getComputedStyle( 'position' ) == 'fixed'; 789 var isFixed = element.getComputedStyle( 'position' ) == 'fixed';
790 790
791 // (#8888) In some cases of a very small viewport, dialog is incorrectly 791 // (http://dev.ckeditor.com/ticket/8888) In some cases of a very small viewport, dialog is incorrectly
792 // positioned in IE7. It also happens that it remains sticky and user cannot 792 // positioned in IE7. It also happens that it remains sticky and user cannot
793 // scroll down/up to reveal dialog's content below/above the viewport; this is 793 // scroll down/up to reveal dialog's content below/above the viewport; this is
794 // cumbersome. 794 // cumbersome.
@@ -862,8 +862,10 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
862 // Reset all inputs back to their default value. 862 // Reset all inputs back to their default value.
863 this.reset(); 863 this.reset();
864 864
865 // Select the first tab by default. 865 // Selects the first tab if no tab is already selected.
866 this.selectPage( this.definition.contents[ 0 ].id ); 866 if ( this._.currentTabId === null ) {
867 this.selectPage( this.definition.contents[ 0 ].id );
868 }
867 869
868 // Set z-index. 870 // Set z-index.
869 if ( CKEDITOR.dialog._.currentZIndex === null ) 871 if ( CKEDITOR.dialog._.currentZIndex === null )
@@ -1038,7 +1040,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
1038 commitContent: function() { 1040 commitContent: function() {
1039 var args = arguments; 1041 var args = arguments;
1040 this.foreach( function( widget ) { 1042 this.foreach( function( widget ) {
1041 // Make sure IE triggers "change" event on last focused input before closing the dialog. (#7915) 1043 // Make sure IE triggers "change" event on last focused input before closing the dialog. (http://dev.ckeditor.com/ticket/7915)
1042 if ( CKEDITOR.env.ie && this._.currentFocusIndex == widget.focusIndex ) 1044 if ( CKEDITOR.env.ie && this._.currentFocusIndex == widget.focusIndex )
1043 widget.getInputElement().$.blur(); 1045 widget.getInputElement().$.blur();
1044 1046
@@ -1090,11 +1092,11 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
1090 var editor = this._.editor; 1092 var editor = this._.editor;
1091 editor.focus(); 1093 editor.focus();
1092 1094
1093 // Give a while before unlock, waiting for focus to return to the editable. (#172) 1095 // Give a while before unlock, waiting for focus to return to the editable. (http://dev.ckeditor.com/ticket/172)
1094 setTimeout( function() { 1096 setTimeout( function() {
1095 editor.focusManager.unlock(); 1097 editor.focusManager.unlock();
1096 1098
1097 // Fixed iOS focus issue (#12381). 1099 // Fixed iOS focus issue (http://dev.ckeditor.com/ticket/12381).
1098 // Keep in mind that editor.focus() does not work in this case. 1100 // Keep in mind that editor.focus() does not work in this case.
1099 if ( CKEDITOR.env.iOS ) { 1101 if ( CKEDITOR.env.iOS ) {
1100 editor.window.focus(); 1102 editor.window.focus();
@@ -1111,7 +1113,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
1111 contentObj.resetInitValue && contentObj.resetInitValue(); 1113 contentObj.resetInitValue && contentObj.resetInitValue();
1112 } ); 1114 } );
1113 1115
1114 // Reset dialog state back to IDLE, if busy (#13213). 1116 // Reset dialog state back to IDLE, if busy (http://dev.ckeditor.com/ticket/13213).
1115 this.setState( CKEDITOR.DIALOG_STATE_IDLE ); 1117 this.setState( CKEDITOR.DIALOG_STATE_IDLE );
1116 }, 1118 },
1117 1119
@@ -1232,7 +1234,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
1232 1234
1233 // [IE] an invisible input[type='text'] will enlarge it's width 1235 // [IE] an invisible input[type='text'] will enlarge it's width
1234 // if it's value is long when it shows, so we clear it's value 1236 // if it's value is long when it shows, so we clear it's value
1235 // before it shows and then recover it (#5649) 1237 // before it shows and then recover it (http://dev.ckeditor.com/ticket/5649)
1236 if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat ) { 1238 if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat ) {
1237 clearOrRecoverTextInputValue( selected[ 1 ] ); 1239 clearOrRecoverTextInputValue( selected[ 1 ] );
1238 selected[ 1 ].show(); 1240 selected[ 1 ].show();
@@ -2106,9 +2108,10 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2106 } 2108 }
2107 2109
2108 function showCover( editor ) { 2110 function showCover( editor ) {
2109 var win = CKEDITOR.document.getWindow(); 2111 var win = CKEDITOR.document.getWindow(),
2110 var config = editor.config, 2112 config = editor.config,
2111 backgroundColorStyle = config.dialog_backgroundCoverColor || 'white', 2113 skinName = ( CKEDITOR.skinName || editor.config.skin ),
2114 backgroundColorStyle = config.dialog_backgroundCoverColor || ( skinName == 'moono-lisa' ? 'black' : 'white' ),
2112 backgroundCoverOpacity = config.dialog_backgroundCoverOpacity, 2115 backgroundCoverOpacity = config.dialog_backgroundCoverOpacity,
2113 baseFloatZIndex = config.baseFloatZIndex, 2116 baseFloatZIndex = config.baseFloatZIndex,
2114 coverKey = CKEDITOR.tools.genKey( backgroundColorStyle, backgroundCoverOpacity, baseFloatZIndex ), 2117 coverKey = CKEDITOR.tools.genKey( backgroundColorStyle, backgroundCoverOpacity, baseFloatZIndex ),
@@ -2198,7 +2201,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2198 resizeCover = resizeFunc; 2201 resizeCover = resizeFunc;
2199 win.on( 'resize', resizeFunc ); 2202 win.on( 'resize', resizeFunc );
2200 resizeFunc(); 2203 resizeFunc();
2201 // Using Safari/Mac, focus must be kept where it is (#7027) 2204 // Using Safari/Mac, focus must be kept where it is (http://dev.ckeditor.com/ticket/7027)
2202 if ( !( CKEDITOR.env.mac && CKEDITOR.env.webkit ) ) 2205 if ( !( CKEDITOR.env.mac && CKEDITOR.env.webkit ) )
2203 coverElement.focus(); 2206 coverElement.focus();
2204 2207
@@ -2559,7 +2562,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2559 if ( elementDefinition && elementDefinition.padding !== undefined ) { 2562 if ( elementDefinition && elementDefinition.padding !== undefined ) {
2560 styles.push( 'padding:' + cssLength( elementDefinition.padding ) ); 2563 styles.push( 'padding:' + cssLength( elementDefinition.padding ) );
2561 } 2564 }
2562 // In IE Quirks alignment has to be done on table cells. (#7324) 2565 // In IE Quirks alignment has to be done on table cells. (http://dev.ckeditor.com/ticket/7324)
2563 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && children[ i ].align ) { 2566 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && children[ i ].align ) {
2564 styles.push( 'text-align:' + children[ i ].align ); 2567 styles.push( 'text-align:' + children[ i ].align );
2565 } 2568 }
@@ -2618,7 +2621,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2618 html.push( 'height:100%;' ); 2621 html.push( 'height:100%;' );
2619 html.push( 'width:' + cssLength( width || '100%' ), ';' ); 2622 html.push( 'width:' + cssLength( width || '100%' ), ';' );
2620 2623
2621 // (#10123) Temp fix for dialog broken layout in latest webkit. 2624 // (http://dev.ckeditor.com/ticket/10123) Temp fix for dialog broken layout in latest webkit.
2622 if ( CKEDITOR.env.webkit ) 2625 if ( CKEDITOR.env.webkit )
2623 html.push( 'float:none;' ); 2626 html.push( 'float:none;' );
2624 2627
@@ -2638,7 +2641,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2638 styles.push( 'height:' + Math.floor( 100 / childHtmlList.length ) + '%' ); 2641 styles.push( 'height:' + Math.floor( 100 / childHtmlList.length ) + '%' );
2639 if ( elementDefinition && elementDefinition.padding !== undefined ) 2642 if ( elementDefinition && elementDefinition.padding !== undefined )
2640 styles.push( 'padding:' + cssLength( elementDefinition.padding ) ); 2643 styles.push( 'padding:' + cssLength( elementDefinition.padding ) );
2641 // In IE Quirks alignment has to be done on table cells. (#7324) 2644 // In IE Quirks alignment has to be done on table cells. (http://dev.ckeditor.com/ticket/7324)
2642 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && children[ i ].align ) 2645 if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && children[ i ].align )
2643 styles.push( 'text-align:' + children[ i ].align ); 2646 styles.push( 'text-align:' + children[ i ].align );
2644 if ( styles.length > 0 ) 2647 if ( styles.length > 0 )
@@ -2983,7 +2986,7 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2983 /** 2986 /**
2984 * Generic dialog command. It opens a specific dialog when executed. 2987 * Generic dialog command. It opens a specific dialog when executed.
2985 * 2988 *
2986 * // Register the "link" command, which opens the "link" dialog. 2989 * // Register the "link" command which opens the "link" dialog.
2987 * editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) ); 2990 * editor.addCommand( 'link', new CKEDITOR.dialogCommand( 'link' ) );
2988 * 2991 *
2989 * @class 2992 * @class
@@ -2992,6 +2995,10 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
2992 * @param {String} dialogName The name of the dialog to open when executing 2995 * @param {String} dialogName The name of the dialog to open when executing
2993 * this command. 2996 * this command.
2994 * @param {Object} [ext] Additional command definition's properties. 2997 * @param {Object} [ext] Additional command definition's properties.
2998 * @param {String} [ext.tabId] You can provide additional property (`tabId`) if you wish to open the dialog on a specific tabId.
2999 *
3000 * // Open the dialog on the 'keystroke' tabId.
3001 * editor.addCommand( 'keystroke', new CKEDITOR.dialogCommand( 'a11yHelp', { tabId: 'keystroke' } ) );
2995 */ 3002 */
2996 CKEDITOR.dialogCommand = function( dialogName, ext ) { 3003 CKEDITOR.dialogCommand = function( dialogName, ext ) {
2997 this.dialogName = dialogName; 3004 this.dialogName = dialogName;
@@ -3000,7 +3007,13 @@ CKEDITOR.DIALOG_STATE_BUSY = 2;
3000 3007
3001 CKEDITOR.dialogCommand.prototype = { 3008 CKEDITOR.dialogCommand.prototype = {
3002 exec: function( editor ) { 3009 exec: function( editor ) {
3003 editor.openDialog( this.dialogName ); 3010 var tabId = this.tabId;
3011 editor.openDialog( this.dialogName, function( dialog ) {
3012 // Select different tab if it's provided (#830).
3013 if ( tabId ) {
3014 dialog.selectPage( tabId );
3015 }
3016 } );
3004 }, 3017 },
3005 3018
3006 // Dialog commands just open a dialog ui, thus require no undo logic, 3019 // Dialog commands just open a dialog ui, thus require no undo logic,
diff --git a/sources/plugins/dialog/samples/assets/my_dialog.js b/sources/plugins/dialog/samples/assets/my_dialog.js
index cf9185e..6239dea 100644
--- a/sources/plugins/dialog/samples/assets/my_dialog.js
+++ b/sources/plugins/dialog/samples/assets/my_dialog.js
@@ -1,5 +1,5 @@
1/** 1/**
2 * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved. 2 * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
3 * For licensing, see LICENSE.md or http://ckeditor.com/license 3 * For licensing, see LICENSE.md or http://ckeditor.com/license
4 */ 4 */
5 5
diff --git a/sources/plugins/dialog/samples/dialog.html b/sources/plugins/dialog/samples/dialog.html
index 7fda2bb..0f22a1a 100644
--- a/sources/plugins/dialog/samples/dialog.html
+++ b/sources/plugins/dialog/samples/dialog.html
@@ -1,6 +1,6 @@
1<!DOCTYPE html> 1<!DOCTYPE html>
2<!-- 2<!--
3Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved. 3Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
4For licensing, see LICENSE.md or http://ckeditor.com/license 4For licensing, see LICENSE.md or http://ckeditor.com/license
5--> 5-->
6<html> 6<html>
@@ -182,7 +182,7 @@ For licensing, see LICENSE.md or http://ckeditor.com/license
182 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a> 182 CKEditor - The text editor for the Internet - <a class="samples" href="http://ckeditor.com/">http://ckeditor.com</a>
183 </p> 183 </p>
184 <p id="copy"> 184 <p id="copy">
185 Copyright &copy; 2003-2016, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico 185 Copyright &copy; 2003-2017, <a class="samples" href="http://cksource.com/">CKSource</a> - Frederico
186 Knabben. All rights reserved. 186 Knabben. All rights reserved.
187 </p> 187 </p>
188 </div> 188 </div>