Commit de27a20a authored by Markus Klein's avatar Markus Klein Committed by Stefan Neufeind
Browse files

[CLEANUP] Replace strlen() with === for zero length check

It is faster to compare a string with === '' to find out if it's empty
than to run strlen() on it.

The replacement rules are applied as follows:
 *    if (strlen($str))
   => if ((string)$str !== '')
 *    if (!is_string($str) || strlen($str) === 0)
   => if (!is_string($str) || $str === '')
 * If it can be seen easily that $str is a string,
   the typecast is omitted.

Resolves: #54091
Releases: 6.2
Change-Id: I59c5cbccea4f98b8f282377e6aa67d970859a457
Reviewed-on: https://review.typo3.org/27091
Reviewed-by: Stefan Neufeind
Tested-by: Stefan Neufeind
parent 0c5a0aa1
......@@ -59,9 +59,13 @@ class TranslationConfigurationProvider {
}
$languageIconTitles[0] = array(
'uid' => 0,
'title' => strlen($modSharedTSconfig['properties']['defaultLanguageLabel']) ? $modSharedTSconfig['properties']['defaultLanguageLabel'] . ' (' . $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage') . ')' : $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage'),
'title' => $modSharedTSconfig['properties']['defaultLanguageLabel'] !== ''
? $modSharedTSconfig['properties']['defaultLanguageLabel'] . ' (' . $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage') . ')'
: $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage'),
'ISOcode' => 'DEF',
'flagIcon' => strlen($modSharedTSconfig['properties']['defaultLanguageFlag']) ? 'flags-' . $modSharedTSconfig['properties']['defaultLanguageFlag'] : 'empty-empty'
'flagIcon' => $modSharedTSconfig['properties']['defaultLanguageFlag'] !== ''
? 'flags-' . $modSharedTSconfig['properties']['defaultLanguageFlag']
: 'empty-empty'
);
// Set "All" language:
$languageIconTitles[-1] = array(
......@@ -80,7 +84,7 @@ class TranslationConfigurationProvider {
$languageIconTitles[$row['uid']]['ISOcode'] = $staticLangRow['lg_iso_2'];
}
}
if (strlen($row['flag'])) {
if ($row['flag'] !== '') {
$languageIconTitles[$row['uid']]['flagIcon'] = IconUtility::mapRecordTypeToSpriteIconName('sys_language', $row);
}
}
......
......@@ -1249,7 +1249,9 @@ class EditDocumentController {
'uid' => 0,
'pid' => 0,
'hidden' => 0,
'title' => strlen($modSharedTSconfig['properties']['defaultLanguageLabel']) ? $modSharedTSconfig['properties']['defaultLanguageLabel'] . ' (' . $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage') . ')' : $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage'),
'title' => $modSharedTSconfig['properties']['defaultLanguageLabel'] !== ''
? $modSharedTSconfig['properties']['defaultLanguageLabel'] . ' (' . $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage') . ')'
: $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_mod_web_list.xlf:defaultLanguage'),
'flag' => $modSharedTSconfig['properties']['defaultLanguageFlag']
)
);
......
......@@ -305,7 +305,7 @@ class PageTreeNavigationController {
*/
public function initializeTemporaryDBmount() {
// Set/Cancel Temporary DB Mount:
if (strlen($this->setTempDBmount)) {
if ((string)$this->setTempDBmount !== '') {
$set = \TYPO3\CMS\Core\Utility\MathUtility::forceIntegerInRange($this->setTempDBmount, 0);
if ($set > 0 && $GLOBALS['BE_USER']->isInWebMount($set)) {
// Setting...:
......
......@@ -463,7 +463,7 @@ class FormsController {
case 'input':
case 'password':
if (strlen(trim($confData['specialEval']))) {
if (trim($confData['specialEval']) !== '') {
$hiddenFields[] = '<input type="hidden" name="FORMCFG[c][' . ($k + 1) * 2 . '][specialEval]" value="' . htmlspecialchars($confData['specialEval']) . '" />';
}
break;
......@@ -684,7 +684,7 @@ class FormsController {
if (trim($vv['extra'])) {
$tArr[2] = trim($vv['extra']);
}
if (strlen($vv['specialEval'])) {
if ($vv['specialEval'] !== '') {
// Preset blank default value so position 3 can get a value...
$thisLine[2] = '';
$thisLine[3] = $vv['specialEval'];
......@@ -698,7 +698,7 @@ class FormsController {
if ((int)$vv['max']) {
$tArr[1] = (int)$vv['max'];
}
if (strlen($vv['specialEval'])) {
if ($vv['specialEval'] !== '') {
// Preset blank default value so position 3 can get a value...
$thisLine[2] = '';
$thisLine[3] = $vv['specialEval'];
......
......@@ -218,7 +218,7 @@ class SuggestDefaultReceiver {
$searchWholePhrase = $this->config['searchWholePhrase'];
$searchString = $this->params['value'];
$searchUid = (int)$searchString;
if (strlen($searchString)) {
if ($searchString !== '') {
$searchString = $GLOBALS['TYPO3_DB']->quoteStr($searchString, $this->table);
$likeCondition = ' LIKE \'' . ($searchWholePhrase ? '%' : '') . $GLOBALS['TYPO3_DB']->escapeStrForLike($searchString, $this->table) . '%\'';
// Search in all fields given by label or label_alt
......@@ -244,7 +244,7 @@ class SuggestDefaultReceiver {
}
}
// add an additional search condition comment
if (isset($this->config['searchCondition']) && strlen($this->config['searchCondition']) > 0) {
if (isset($this->config['searchCondition']) && $this->config['searchCondition'] !== '') {
$this->selectClause .= ' AND ' . $this->config['searchCondition'];
}
// add the global clauses to the where-statement
......
......@@ -105,7 +105,7 @@ class TreeElement {
$item->checked = in_array($additionalItem[1], $selectedNodes);
if (file_exists(PATH_typo3 . $additionalItem[3])) {
$item->icon = $additionalItem[3];
} elseif (strlen(trim($additionalItem[3]))) {
} elseif (trim($additionalItem[3]) !== '') {
$item->iconCls = \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconClasses($additionalItem[3]);
}
$itemArray[] = $item;
......
......@@ -2968,7 +2968,7 @@ TBE_EDITOR.customEvalFunctions[\'' . $evalData . '\'] = function(value) {
$theTitle = $value['title'];
// If there is a title, check for LLL label
if (strlen($theTitle) > 0) {
if ((string)$theTitle !== '') {
$theTitle = htmlspecialchars(GeneralUtility::fixed_lgd_cs($this->sL($theTitle), 30));
}
// If it's a "section" or "container":
......@@ -3134,7 +3134,7 @@ TBE_EDITOR.customEvalFunctions[\'' . $evalData . '\'] = function(value) {
$alertMsgOnChange = '';
}
$fakePA['fieldChangeFunc'] = $PA['fieldChangeFunc'];
if (strlen($alertMsgOnChange)) {
if ($alertMsgOnChange !== '') {
$fakePA['fieldChangeFunc']['alert'] = $alertMsgOnChange;
}
$fakePA['onFocus'] = $PA['onFocus'];
......
......@@ -697,14 +697,14 @@ abstract class AbstractTreeView {
* @todo Define visibility
*/
public function getTitleStr($row, $titleLen = 30) {
if ($this->ext_showNavTitle && strlen(trim($row['nav_title'])) > 0) {
if ($this->ext_showNavTitle && trim($row['nav_title']) !== '') {
$title = '<span title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_tca.xlf:title', TRUE) . ' ' . htmlspecialchars(trim($row['title'])) . '">' . htmlspecialchars(GeneralUtility::fixed_lgd_cs($row['nav_title'], $titleLen)) . '</span>';
} else {
$title = htmlspecialchars(GeneralUtility::fixed_lgd_cs($row['title'], $titleLen));
if (strlen(trim($row['nav_title'])) > 0) {
if (trim($row['nav_title']) !== '') {
$title = '<span title="' . $GLOBALS['LANG']->sL('LLL:EXT:cms/locallang_tca.xlf:pages.nav_title', TRUE) . ' ' . htmlspecialchars(trim($row['nav_title'])) . '">' . $title . '</span>';
}
$title = strlen(trim($row['title'])) == 0 ? '<em>[' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.no_title', TRUE) . ']</em>' : $title;
$title = trim($row['title']) === '' ? '<em>[' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:labels.no_title', TRUE) . ']</em>' : $title;
}
return $title;
}
......
......@@ -2607,10 +2607,10 @@ class BackendUtility {
// Look if a fixed preview language should be added:
$viewLanguageOrder = $GLOBALS['BE_USER']->getTSConfigVal('options.view.languageOrder');
if (strlen($viewLanguageOrder) > 0) {
if ((string)$viewLanguageOrder !== '') {
$suffix = '';
// Find allowed languages (if none, all are allowed!)
if (!$GLOBALS['BE_USER']->user['admin'] && strlen($GLOBALS['BE_USER']->groupData['allowed_languages'])) {
if (!$GLOBALS['BE_USER']->user['admin'] && $GLOBALS['BE_USER']->groupData['allowed_languages'] !== '') {
$allowedLanguages = array_flip(explode(',', $GLOBALS['BE_USER']->groupData['allowed_languages']));
}
// Traverse the view order, match first occurence:
......@@ -3499,7 +3499,7 @@ class BackendUtility {
$parserList = implode(',', array_keys($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['softRefParser_GL'])) . ',' . $parserList;
}
// Return immediately if list is blank:
if (!strlen($parserList)) {
if ($parserList === '') {
return FALSE;
}
// Otherwise parse the list:
......
......@@ -566,7 +566,7 @@ class PageLayoutView extends \TYPO3\CMS\Recordlist\RecordList\AbstractDatabaseRe
$grid .= $head[$columnKey] . $content[$columnKey];
} elseif (isset($columnConfig['colPos']) && $columnConfig['colPos'] !== '') {
$grid .= $this->tt_content_drawColHeader($GLOBALS['LANG']->getLL('noAccess'), '', '');
} elseif (isset($columnConfig['name']) && strlen($columnConfig['name']) > 0) {
} elseif (isset($columnConfig['name']) && $columnConfig['name'] !== '') {
$grid .= $this->tt_content_drawColHeader($GLOBALS['LANG']->sL($columnConfig['name']) . ' (' . $GLOBALS['LANG']->getLL('notAssigned') . ')', '', '');
} else {
$grid .= $this->tt_content_drawColHeader($GLOBALS['LANG']->getLL('notAssigned'), '', '');
......@@ -1543,7 +1543,7 @@ class PageLayoutView extends \TYPO3\CMS\Recordlist\RecordList\AbstractDatabaseRe
unset($langSelItems[$row['uid']]);
}
// Remove disallowed languages
if (count($langSelItems) > 1 && !$GLOBALS['BE_USER']->user['admin'] && strlen($GLOBALS['BE_USER']->groupData['allowed_languages'])) {
if (count($langSelItems) > 1 && !$GLOBALS['BE_USER']->user['admin'] && $GLOBALS['BE_USER']->groupData['allowed_languages'] !== '') {
$allowed_languages = array_flip(explode(',', $GLOBALS['BE_USER']->groupData['allowed_languages']));
if (count($allowed_languages)) {
foreach ($langSelItems as $key => $value) {
......
......@@ -1138,8 +1138,8 @@ class BackendUserAuthentication extends \TYPO3\CMS\Core\Authentication\AbstractU
$TSConf = array('value' => NULL, 'properties' => NULL);
$parts = GeneralUtility::trimExplode('.', $objectString, TRUE, 2);
$key = $parts[0];
if (strlen($key) > 0) {
if (count($parts) > 1 && strlen($parts[1]) > 0) {
if ($key !== '') {
if (count($parts) > 1 && $parts[1] !== '') {
// Go on, get the next level
if (is_array($config[$key . '.'])) {
$TSConf = $this->getTSConfig($parts[1], $config[$key . '.']);
......
......@@ -152,7 +152,7 @@ class RedisBackend extends \TYPO3\CMS\Core\Cache\Backend\AbstractBackend impleme
\TYPO3\CMS\Core\Utility\GeneralUtility::sysLog('Could not connect to redis server.', 'core', \TYPO3\CMS\Core\Utility\GeneralUtility::SYSLOG_SEVERITY_ERROR);
}
if ($this->connected) {
if (strlen($this->password)) {
if ($this->password !== '') {
$success = $this->redis->auth($this->password);
if (!$success) {
throw new \TYPO3\CMS\Core\Cache\Exception('The given password was not accepted by the redis server.', 1279765134);
......@@ -329,7 +329,7 @@ class RedisBackend extends \TYPO3\CMS\Core\Cache\Backend\AbstractBackend impleme
if ($this->connected) {
$storedEntry = $this->redis->get(self::IDENTIFIER_DATA_PREFIX . $entryIdentifier);
}
if ($this->compression && strlen($storedEntry) > 0) {
if ($this->compression && (string)$storedEntry !== '') {
$storedEntry = gzuncompress($storedEntry);
}
return $storedEntry;
......
......@@ -187,7 +187,7 @@ class Typo3DatabaseBackend extends \TYPO3\CMS\Core\Cache\Backend\AbstractBackend
if (is_array($cacheEntry)) {
$cacheEntry = $cacheEntry['content'];
}
if ($this->compression && strlen($cacheEntry)) {
if ($this->compression && (string)$cacheEntry !== '') {
$cacheEntry = gzuncompress($cacheEntry);
}
return $cacheEntry !== NULL ? $cacheEntry : FALSE;
......
......@@ -1688,11 +1688,11 @@ class CharsetConverter {
return $string;
} else {
if ($len > 0) {
if (strlen($string[$i])) {
if (isset($string[$i])) {
return substr($string, 0, $i) . $crop;
}
} else {
if (strlen($string[$i - 1])) {
if (isset($string[$i - 1])) {
return $crop . substr($string, $i);
}
}
......@@ -1890,7 +1890,7 @@ class CharsetConverter {
return $str;
}
$out = '';
for ($i = 0; strlen($str[$i]); $i++) {
for ($i = 0; isset($str[$i]); $i++) {
$c = $str[$i];
if (isset($map[$c])) {
$out .= $map[$c];
......@@ -1956,7 +1956,7 @@ class CharsetConverter {
*/
public function utf8_strlen($str) {
$n = 0;
for ($i = 0; strlen($str[$i]); $i++) {
for ($i = 0; isset($str[$i]); $i++) {
$c = ord($str[$i]);
// Single-byte (0xxxxxx)
if (!($c & 128)) {
......@@ -2073,7 +2073,7 @@ class CharsetConverter {
$i = strlen($str) - 1;
$d = -1;
}
for (; strlen($str[$i]) && $n < $p; $i += $d) {
for (; isset($str[$i]) && $n < $p; $i += $d) {
$c = (int)ord($str[$i]);
// single-byte (0xxxxxx)
if (!($c & 128)) {
......@@ -2083,7 +2083,7 @@ class CharsetConverter {
$n++;
}
}
if (!strlen($str[$i])) {
if (!isset($str[$i])) {
// Offset beyond string length
return FALSE;
}
......@@ -2121,7 +2121,7 @@ class CharsetConverter {
$n++;
}
}
if (!strlen($str[$i])) {
if (!isset($str[$i])) {
// Offset beyond string length
return FALSE;
}
......@@ -2153,7 +2153,7 @@ class CharsetConverter {
default:
return $str;
}
for ($i = 0; strlen($str[$i]); $i++) {
for ($i = 0; isset($str[$i]); $i++) {
$c = ord($str[$i]);
// single-byte (0xxxxxx)
if (!($c & 128)) {
......@@ -2199,7 +2199,7 @@ class CharsetConverter {
*/
public function euc_strtrunc($str, $len, $charset) {
$sjis = $charset == 'shift_jis';
for ($i = 0; strlen($str[$i]) && $i < $len; $i++) {
for ($i = 0; isset($str[$i]) && $i < $len; $i++) {
$c = ord($str[$i]);
if ($sjis) {
if ($c >= 128 && $c < 160 || $c >= 224) {
......@@ -2211,7 +2211,7 @@ class CharsetConverter {
}
}
}
if (!strlen($str[$i])) {
if (!isset($str[$i])) {
return $str;
}
// string shorter than supplied length
......@@ -2265,7 +2265,7 @@ class CharsetConverter {
public function euc_strlen($str, $charset) {
$sjis = $charset == 'shift_jis';
$n = 0;
for ($i = 0; strlen($str[$i]); $i++) {
for ($i = 0; isset($str[$i]); $i++) {
$c = ord($str[$i]);
if ($sjis) {
if ($c >= 128 && $c < 160 || $c >= 224) {
......@@ -2303,7 +2303,7 @@ class CharsetConverter {
$i = strlen($str) - 1;
$d = -1;
}
for (; strlen($str[$i]) && $n < $p; $i += $d) {
for (; isset($str[$i]) && $n < $p; $i += $d) {
$c = ord($str[$i]);
if ($sjis) {
if ($c >= 128 && $c < 160 || $c >= 224) {
......@@ -2316,7 +2316,7 @@ class CharsetConverter {
}
$n++;
}
if (!strlen($str[$i])) {
if (!isset($str[$i])) {
return FALSE;
}
// offset beyond string length
......@@ -2358,7 +2358,7 @@ class CharsetConverter {
}
$sjis = $charset == 'shift_jis';
$out = '';
for ($i = 0; strlen($str[$i]); $i++) {
for ($i = 0; isset($str[$i]); $i++) {
$mbc = $str[$i];
$c = ord($mbc);
if ($sjis) {
......
......@@ -287,7 +287,7 @@ abstract class AbstractConditionMatcher {
break;
case 'useragent':
$test = trim($value);
if (strlen($test)) {
if ($test !== '') {
return $this->searchStringWildcard($browserInfo['useragent'], $test);
}
break;
......
......@@ -466,7 +466,7 @@ class SystemEnvironmentBuilder {
*/
static protected function getPathSiteByRelativePathPart($relativePathPart) {
$entryScriptDirectory = self::getUnifiedDirectoryNameWithTrailingSlash(PATH_thisScript);
if (strlen($relativePathPart) > 0) {
if ($relativePathPart !== '') {
$pathSite = substr($entryScriptDirectory, 0, -strlen($relativePathPart));
} else {
$pathSite = $entryScriptDirectory;
......
......@@ -2390,7 +2390,7 @@ class DataHandler {
}
$GLOBALS['TYPO3_DB']->sql_free_result($res);
// If the new value is there:
$value = strlen($newValue) ? $newValue : $value;
$value = $newValue !== '' ? $newValue : $value;
}
return $value;
}
......@@ -3443,7 +3443,7 @@ class DataHandler {
// Process references and files, currently that means only the files, prepending absolute paths:
$dataValue = $this->copyRecord_procFilesRefs($dsConf, $uid, $dataValue);
// If references are set for this field, set flag so they can be corrected later (in ->remapListedDBRecords())
if ($this->isReferenceField($dsConf) && strlen($dataValue)) {
if ($this->isReferenceField($dsConf) && (string)$dataValue !== '') {
$dataValue = $this->copyRecord_procBasedOnFieldType($table, $uid, $field, $dataValue, array(), $dsConf, $realDestPid);
$this->registerDBList[$table][$uid][$field] = 'FlexForm_reference';
}
......@@ -3996,14 +3996,13 @@ class DataHandler {
foreach ($GLOBALS['TCA'][$Ttable]['columns'] as $fN => $fCfg) {
// Check if we are just prefixing:
if ($fCfg['l10n_mode'] == 'prefixLangTitle') {
if (($fCfg['config']['type'] == 'text' || $fCfg['config']['type'] == 'input') && strlen($row[$fN])) {
if (($fCfg['config']['type'] == 'text' || $fCfg['config']['type'] == 'input') && (string)$row[$fN] !== '') {
list($tscPID) = BackendUtility::getTSCpid($table, $uid, '');
$TSConfig = $this->getTCEMAIN_TSconfig($tscPID);
if (isset($TSConfig['translateToMessage']) && strlen($TSConfig['translateToMessage'])) {
$translateToMsg = @sprintf($TSConfig['translateToMessage'], $langRec['title']);
}
if (!strlen($translateToMsg)) {
if (empty($TSConfig['translateToMessage'])) {
$translateToMsg = 'Translate to ' . $langRec['title'] . ':';
} else {
$translateToMsg = @sprintf($TSConfig['translateToMessage'], $langRec['title']);
}
$overrideValues[$fN] = '[' . $translateToMsg . '] ' . $row[$fN];
}
......@@ -4987,7 +4986,7 @@ class DataHandler {
// Extract parameters:
list($table, $uid, $field) = $pParams;
// If references are set for this field, set flag so they can be corrected later:
if ($this->isReferenceField($dsConf) && strlen($dataValue)) {
if ($this->isReferenceField($dsConf) && (string)$dataValue !== '') {
$vArray = $this->remapListedDBRecords_procDBRefs($dsConf, $dataValue, $uid, $table);
if (is_array($vArray)) {
$dataValue = implode(',', $vArray);
......
......@@ -837,7 +837,7 @@ class QueryGenerator {
}
} else {
$singleValue = $row[$fN];
if (strlen($singleValue) && !stristr($singleValue, '_')) {
if ($singleValue !== '' && !stristr($singleValue, '_')) {
$dontPrefixFirstTable = 1;
}
}
......
......@@ -841,7 +841,7 @@ class QueryView {
}
} else {
$singleValue = $row[$fN];
if (strlen($singleValue) && !stristr($singleValue, '_')) {
if ($singleValue !== '' && !stristr($singleValue, '_')) {
$dontPrefixFirstTable = 1;
}
}
......
......@@ -391,7 +391,7 @@ class ReferenceIndex {
}
}
// Soft References:
if (strlen($value) && ($softRefs = BackendUtility::explodeSoftRefParserList($conf['softref']))) {
if ((string)$value !== '' && ($softRefs = BackendUtility::explodeSoftRefParserList($conf['softref']))) {
$softRefValue = $value;
foreach ($softRefs as $spKey => $spParams) {
$softRefObj = BackendUtility::softRefParserObj($spKey);
......@@ -399,7 +399,7 @@ class ReferenceIndex {
$resultArray = $softRefObj->findRef($table, $field, $uid, $softRefValue, $spKey, $spParams);
if (is_array($resultArray)) {
$outRow[$field]['softrefs']['keys'][$spKey] = $resultArray['elements'];
if (strlen($resultArray['content'])) {
if ((string)$resultArray['content'] !== '') {
$softRefValue = $resultArray['content'];
}
}
......@@ -443,7 +443,7 @@ class ReferenceIndex {
$this->temp_flexRelations['db'][$structurePath] = $result;
}
// Soft References:
if (strlen($dataValue) && ($softRefs = BackendUtility::explodeSoftRefParserList($dsConf['softref']))) {
if ((string)$dataValue !== '' && ($softRefs = BackendUtility::explodeSoftRefParserList($dsConf['softref']))) {
$softRefValue = $dataValue;
foreach ($softRefs as $spKey => $spParams) {
$softRefObj = BackendUtility::softRefParserObj($spKey);
......@@ -451,7 +451,7 @@ class ReferenceIndex {
$resultArray = $softRefObj->findRef($table, $field, $uid, $softRefValue, $spKey, $spParams, $structurePath);
if (is_array($resultArray) && is_array($resultArray['elements'])) {
$this->temp_flexRelations['softrefs'][$structurePath]['keys'][$spKey] = $resultArray['elements'];
if (strlen($resultArray['content'])) {
if ((string)$resultArray['content'] !== '') {
$softRefValue = $resultArray['content'];
}
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment