Permalink
Browse files

move to strict comparisons

  • Loading branch information...
1 parent 591e1d4 commit 3985e3ee7da0a277d24904974a0994e7a2c21ad2 @tommyrot committed Oct 30, 2013
Showing with 68 additions and 68 deletions.
  1. +6 −6 maintenance.php
  2. +9 −9 nick.php
  3. +13 −13 parser.php
  4. +4 −4 parser_eggdrop.php
  5. +3 −3 parser_hexchat.php
  6. +2 −2 parser_irssi.php
  7. +2 −2 parser_limechat.php
  8. +3 −3 parser_mirc6.php
  9. +1 −1 parser_nodelog.php
  10. +3 −3 parser_supybot.php
  11. +2 −2 parser_textual.php
  12. +3 −3 parser_znc.php
  13. +17 −17 sss.php
View
@@ -40,14 +40,14 @@ public function __construct($settings)
continue;
}
- if ($type == 'string') {
+ if ($type === 'string') {
$this->$key = $settings[$key];
- } elseif ($type == 'int') {
+ } elseif ($type === 'int') {
$this->$key = (int) $settings[$key];
- } elseif ($type == 'bool') {
- if (strtolower($settings[$key]) == 'true') {
+ } elseif ($type === 'bool') {
+ if (strtolower($settings[$key]) === 'true') {
$this->$key = true;
- } elseif (strtolower($settings[$key]) == 'false') {
+ } elseif (strtolower($settings[$key]) === 'false') {
$this->$key = false;
}
}
@@ -194,7 +194,7 @@ private function calculate_rankings($sqlite3)
$sqlite3->exec('DELETE FROM ruid_rankings') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
foreach ($ruid_activity_by_month_cumulative as $key => $values) {
- if (empty($prevdate) || $values['date'] != $prevdate) {
+ if (empty($prevdate) || $values['date'] !== $prevdate) {
$rank = 1;
}
View
@@ -235,7 +235,7 @@ public function write_data($sqlite3)
}
if (empty($result)) {
- $sqlite3->exec('INSERT INTO uid_details (uid, csnick'.($this->firstseen != '' ? ', firstseen, lastseen' : '').') VALUES (NULL, \''.$sqlite3->escapeString($this->csnick).'\''.($this->firstseen != '' ? ', DATETIME(\''.$this->firstseen.'\'), DATETIME(\''.$this->lastseen.'\')' : '').')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
+ $sqlite3->exec('INSERT INTO uid_details (uid, csnick'.($this->firstseen !== '' ? ', firstseen, lastseen' : '').') VALUES (NULL, \''.$sqlite3->escapeString($this->csnick).'\''.($this->firstseen !== '' ? ', DATETIME(\''.$this->firstseen.'\'), DATETIME(\''.$this->lastseen.'\')' : '').')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
$uid = $sqlite3->lastInsertRowID();
} else {
$uid = $result['uid'];
@@ -248,15 +248,15 @@ public function write_data($sqlite3)
* to avoid it from being overwritten by a lowercase $prevnick (streak code) or weirdly cased
* nick due to a slap.
*/
- if ($this->firstseen != '') {
- $sqlite3->exec('UPDATE uid_details SET csnick = \''.$sqlite3->escapeString($this->csnick).'\''.($result['firstseen'] == '0000-00-00 00:00:00' ? ', firstseen = DATETIME(\''.$this->firstseen.'\')' : '').', lastseen = DATETIME(\''.$this->lastseen.'\') WHERE uid = '.$uid) or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
+ if ($this->firstseen !== '') {
+ $sqlite3->exec('UPDATE uid_details SET csnick = \''.$sqlite3->escapeString($this->csnick).'\''.($result['firstseen'] === '0000-00-00 00:00:00' ? ', firstseen = DATETIME(\''.$this->firstseen.'\')' : '').', lastseen = DATETIME(\''.$this->lastseen.'\') WHERE uid = '.$uid) or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
}
}
/**
* Write data to database table "uid_activity".
*/
- if ($this->l_total != 0) {
+ if ($this->l_total !== 0) {
$queryparts = $this->get_queryparts($sqlite3, array('l_night', 'l_morning', 'l_afternoon', 'l_evening', 'l_total'));
$sqlite3->exec('INSERT OR IGNORE INTO uid_activity (uid, date, '.implode(', ', $queryparts['columnlist']).') VALUES ('.$uid.', \''.$this->date.'\', '.implode(', ', $queryparts['values']).')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
$sqlite3->exec('UPDATE uid_activity SET '.implode(', ', $queryparts['update-assignments']).' WHERE CHANGES() = 0 AND uid = '.$uid.' AND date = \''.$this->date.'\'') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
@@ -290,13 +290,13 @@ public function write_data($sqlite3)
$queryparts = $this->get_queryparts($sqlite3, array('l_00', 'l_01', 'l_02', 'l_03', 'l_04', 'l_05', 'l_06', 'l_07', 'l_08', 'l_09', 'l_10', 'l_11', 'l_12', 'l_13', 'l_14', 'l_15', 'l_16', 'l_17', 'l_18', 'l_19', 'l_20', 'l_21', 'l_22', 'l_23', 'l_night', 'l_morning', 'l_afternoon', 'l_evening', 'l_total', 'l_mon_night', 'l_mon_morning', 'l_mon_afternoon', 'l_mon_evening', 'l_tue_night', 'l_tue_morning', 'l_tue_afternoon', 'l_tue_evening', 'l_wed_night', 'l_wed_morning', 'l_wed_afternoon', 'l_wed_evening', 'l_thu_night', 'l_thu_morning', 'l_thu_afternoon', 'l_thu_evening', 'l_fri_night', 'l_fri_morning', 'l_fri_afternoon', 'l_fri_evening', 'l_sat_night', 'l_sat_morning', 'l_sat_afternoon', 'l_sat_evening', 'l_sun_night', 'l_sun_morning', 'l_sun_afternoon', 'l_sun_evening', 'urls', 'words', 'characters', 'monologues', 'slaps', 'slapped', 'exclamations', 'questions', 'actions', 'uppercased', 'quote', 'ex_exclamations', 'ex_questions', 'ex_actions', 'ex_uppercased'));
if (!empty($queryparts)) {
- $sqlite3->exec('INSERT OR IGNORE INTO uid_lines (uid, '.implode(', ', $queryparts['columnlist']).($this->lasttalked != '' ? ', lasttalked' : '').') VALUES ('.$uid.', '.implode(', ', $queryparts['values']).($this->lasttalked != '' ? ', DATETIME(\''.$this->lasttalked.'\')' : '').')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
- $sqlite3->exec('UPDATE uid_lines SET '.implode(', ', $queryparts['update-assignments']).($this->lasttalked != '' ? ', lasttalked = DATETIME(\''.$this->lasttalked.'\')' : '').' WHERE CHANGES() = 0 AND uid = '.$uid) or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
+ $sqlite3->exec('INSERT OR IGNORE INTO uid_lines (uid, '.implode(', ', $queryparts['columnlist']).($this->lasttalked !== '' ? ', lasttalked' : '').') VALUES ('.$uid.', '.implode(', ', $queryparts['values']).($this->lasttalked !== '' ? ', DATETIME(\''.$this->lasttalked.'\')' : '').')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
+ $sqlite3->exec('UPDATE uid_lines SET '.implode(', ', $queryparts['update-assignments']).($this->lasttalked !== '' ? ', lasttalked = DATETIME(\''.$this->lasttalked.'\')' : '').' WHERE CHANGES() = 0 AND uid = '.$uid) or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
/**
* Update $topmonologue separately as we want to keep the highest value instead of the sum.
*/
- if ($this->topmonologue != 0) {
+ if ($this->topmonologue !== 0) {
if (($topmonologue = $sqlite3->querySingle('SELECT topmonologue FROM uid_lines WHERE uid = '.$uid)) === false) {
$this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
}
@@ -363,7 +363,7 @@ public function write_data($sqlite3, $uid)
/**
* Write data to database table "fqdns".
*/
- if ($this->fqdn != '') {
+ if ($this->fqdn !== '') {
if (($fid = $sqlite3->querySingle('SELECT fid FROM fqdns WHERE fqdn = \''.$this->fqdn.'\'')) === false) {
$this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
}
@@ -382,7 +382,7 @@ public function write_data($sqlite3, $uid)
}
if (is_null($lid)) {
- $sqlite3->exec('INSERT INTO urls (lid, url'.($this->fqdn != '' ? ', fid' : '').') VALUES (NULL, \''.$sqlite3->escapeString($this->url).'\''.($this->fqdn != '' ? ', '.$fid : '').')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
+ $sqlite3->exec('INSERT INTO urls (lid, url'.($this->fqdn !== '' ? ', fid' : '').') VALUES (NULL, \''.$sqlite3->escapeString($this->url).'\''.($this->fqdn !== '' ? ', '.$fid : '').')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
$lid = $sqlite3->lastInsertRowID();
}
View
@@ -138,14 +138,14 @@
continue;
}
- if ($type == 'string') {
+ if ($type === 'string') {
$this->$key = $settings[$key];
- } elseif ($type == 'int') {
+ } elseif ($type === 'int') {
$this->$key = (int) $settings[$key];
- } elseif ($type == 'bool') {
- if (strtolower($settings[$key]) == 'true') {
+ } elseif ($type === 'bool') {
+ if (strtolower($settings[$key]) === 'true') {
$this->$key = true;
- } elseif (strtolower($settings[$key]) == 'false') {
+ } elseif (strtolower($settings[$key]) === 'false') {
$this->$key = false;
}
}
@@ -168,7 +168,7 @@
}
if (!is_null($datetime)) {
- if ($this->nicks_objs[$nick]->get_value('firstseen') == '') {
+ if ($this->nicks_objs[$nick]->get_value('firstseen') === '') {
$this->nicks_objs[$nick]->set_value('firstseen', $datetime);
}
@@ -244,7 +244,7 @@
if (!preg_match('/^'.$this->hex_validutf8.'+$/', $line)) {
$this->newline = '';
- while ($line != '') {
+ while ($line !== '') {
/**
* 1. Match the first valid multibyte character or otherwise a single byte.
* 2. Pass it on to rebuild_line() and replace the character with an empty string
@@ -446,7 +446,7 @@
/**
* Keep track of monologues.
*/
- if ($nick == $this->prevnick) {
+ if ($nick === $this->prevnick) {
$this->streak++;
} else {
/**
@@ -461,7 +461,7 @@
* data can be added. It doesn't matter if $prevnick is lowercase since it won't
* be updated before it is actually seen (ie. on any other activity).
*/
- if ($this->l_total == 0) {
+ if ($this->l_total === 0) {
$this->add_nick($this->prevnick, null);
}
@@ -573,7 +573,7 @@
* less than 50% non letter characters from the Basic Latin and Latin-1 Supplement character
* sets in them.
*/
- if ($line_length >= 2 && mb_strtoupper($line, 'UTF-8') == $line && mb_strlen(preg_replace('/[\x21-\x40\x5B-\x60\x7B-\x7E]|\xC2[\xA1-\xBF]|\xC3\x97|\xC3\xB7|\xEF\xBF\xBD/', '', $line), 'UTF-8') * 2 > $line_length) {
+ if ($line_length >= 2 && mb_strtoupper($line, 'UTF-8') === $line && mb_strlen(preg_replace('/[\x21-\x40\x5B-\x60\x7B-\x7E]|\xC2[\xA1-\xBF]|\xC3\x97|\xC3\xB7|\xEF\xBF\xBD/', '', $line), 'UTF-8') * 2 > $line_length) {
$this->nicks_objs[$nick]->add_value('uppercased', 1);
if (!$skipquote && $line_length <= 255) {
@@ -671,7 +671,7 @@
*/
final private function validate_nick($csnick)
{
- if ($csnick != '0' && preg_match('/^[][^{}|\\\`_0-9a-z-]{1,32}$/i', $csnick)) {
+ if ($csnick !== '0' && preg_match('/^[][^{}|\\\`_0-9a-z-]{1,32}$/i', $csnick)) {
return true;
} else {
return false;
@@ -693,7 +693,7 @@
/**
* Write channel totals to database.
*/
- if ($this->l_total != 0) {
+ if ($this->l_total !== 0) {
$queryparts = $this->get_queryparts($sqlite3, array('l_00', 'l_01', 'l_02', 'l_03', 'l_04', 'l_05', 'l_06', 'l_07', 'l_08', 'l_09', 'l_10', 'l_11', 'l_12', 'l_13', 'l_14', 'l_15', 'l_16', 'l_17', 'l_18', 'l_19', 'l_20', 'l_21', 'l_22', 'l_23', 'l_night', 'l_morning', 'l_afternoon', 'l_evening', 'l_total'));
$sqlite3->exec('INSERT OR IGNORE INTO channel_activity (date, '.implode(', ', $queryparts['columnlist']).') VALUES (\''.$this->date.'\', '.implode(', ', $queryparts['values']).')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
$sqlite3->exec('UPDATE channel_activity SET '.implode(', ', $queryparts['update-assignments']).' WHERE CHANGES() = 0 AND date = \''.$this->date.'\'') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
@@ -716,7 +716,7 @@
/**
* Write streak data (history) to database.
*/
- if ($this->l_total != 0) {
+ if ($this->l_total !== 0) {
$sqlite3->exec('DELETE FROM streak_history') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
$sqlite3->exec('INSERT INTO streak_history (prevnick, streak) VALUES (\''.$sqlite3->escapeString($this->prevnick).'\', '.$this->streak.')') or $this->output('critical', basename(__FILE__).':'.__LINE__.', sqlite3 says: '.$sqlite3->lastErrorMsg());
}
View
@@ -85,7 +85,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -136,13 +136,13 @@ protected function parse_line($line)
* Prevent the parser from repeating a preceding repeat line. Also, skip processing if we find a
* repeat line on the first line of the logfile. We can't look back across files.
*/
- if ($this->linenum == 1 || $this->repeatlock) {
+ if ($this->linenum === 1 || $this->repeatlock) {
return null;
}
$this->linenum--;
$this->repeatlock = true;
- $this->output('debug', 'parse_line(): repeating line '.$this->linenum.': '.$matches['num'].' time'.(($matches['num'] != '1') ? 's' : ''));
+ $this->output('debug', 'parse_line(): repeating line '.$this->linenum.': '.$matches['num'].' time'.(($matches['num'] !== '1') ? 's' : ''));
for ($i = 1, $j = (int) $matches['num']; $i <= $j; $i++) {
$this->parse_line($this->prevline);
@@ -154,7 +154,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -72,13 +72,13 @@ protected function parse_line($line)
} elseif (preg_match('/^\S{3} \d{2} (?<time>\d{2}:\d{2}(:\d{2})?) \* (?<nick_performing>\S+) (?<modesign>gives|removes) (?<mode>channel operator status|voice) (to|from) (?<nicks_undergoing>\S+( \S+)*)$/', $line, $matches)) {
$nicks_undergoing = explode(' ', $matches['nicks_undergoing']);
- if ($matches['modesign'] == 'gives') {
+ if ($matches['modesign'] === 'gives') {
$modesign = '+';
} else {
$modesign = '-';
}
- if ($matches['mode'] == 'channel operator status') {
+ if ($matches['mode'] === 'channel operator status') {
$mode = 'o';
} else {
$mode = 'v';
@@ -115,7 +115,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -82,7 +82,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -127,7 +127,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -79,7 +79,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -114,7 +114,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -84,7 +84,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -118,7 +118,7 @@ protected function parse_line($line)
* "Topic" lines.
*/
} elseif (preg_match('/^\[(?<time>\d{2}:\d{2}(:\d{2})?)\] \* (?<nick>\S+) changes topic to \'(?<line>.+)\'$/', $line, $matches)) {
- if ($matches['line'] != ' ') {
+ if ($matches['line'] !== ' ') {
$this->set_topic($this->date.' '.$matches['time'], $matches['nick'], $matches['line']);
}
@@ -131,7 +131,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -60,7 +60,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -76,7 +76,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -110,7 +110,7 @@ protected function parse_line($line)
* "Topic" lines.
*/
} elseif (preg_match('/^\d{4}-\d{2}-\d{2}T(?<time>\d{2}:\d{2}:\d{2}) \*\*\* (?<nick>\S+) changes topic to "(?<line>.+)"$/', $line, $matches)) {
- if ($matches['line'] != ' ') {
+ if ($matches['line'] !== ' ') {
$this->set_topic($this->date.' '.$matches['time'], $matches['nick'], $matches['line']);
}
@@ -123,7 +123,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -80,7 +80,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -115,7 +115,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
View
@@ -77,7 +77,7 @@ protected function parse_line($line)
for ($i = 0, $j = strlen($matches['modes']); $i < $j; $i++) {
$mode = substr($matches['modes'], $i, 1);
- if ($mode == '-' || $mode == '+') {
+ if ($mode === '-' || $mode === '+') {
$modesign = $mode;
} else {
$this->set_mode($this->date.' '.$matches['time'], $matches['nick_performing'], $nicks_undergoing[$modenum], $modesign.$mode);
@@ -111,7 +111,7 @@ protected function parse_line($line)
* "Topic" lines.
*/
} elseif (preg_match('/^\[(?<time>\d{2}:\d{2}(:\d{2})?)\] \*\*\* (?<nick>\S+) changes topic to \'(?<line>.+)\'$/', $line, $matches)) {
- if ($matches['line'] != ' ') {
+ if ($matches['line'] !== ' ') {
$this->set_topic($this->date.' '.$matches['time'], $matches['nick'], $matches['line']);
}
@@ -124,7 +124,7 @@ protected function parse_line($line)
/**
* Skip everything else.
*/
- } elseif ($line != '') {
+ } elseif ($line !== '') {
$this->output('debug', 'parse_line(): skipping line '.$this->linenum.': \''.$line.'\'');
}
}
Oops, something went wrong.

0 comments on commit 3985e3e

Please sign in to comment.