Skip to content

Commit

Permalink
deploy: 606b7d0
Browse files Browse the repository at this point in the history
  • Loading branch information
phoenixide committed Dec 25, 2024
1 parent 3b5635b commit 5a51ba9
Show file tree
Hide file tree
Showing 59 changed files with 1,208 additions and 128 deletions.
4 changes: 2 additions & 2 deletions appConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ window.AppConfig = {
"app_notification_url": "assets/notifications/dev/",
"app_update_url": "https://updates.phcode.io/tauri/update-latest-experimental-build.json",
"linting.enabled_by_default": true,
"build_timestamp": "2024-12-25T06:07:45.665Z",
"build_timestamp": "2024-12-25T16:15:20.010Z",
"googleAnalyticsID": "G-P4HJFPDB76",
"googleAnalyticsIDDesktop": "G-VE5BXWJ0HF",
"mixPanelID": "49c4d164b592be2350fc7af06a259bf3",
Expand All @@ -38,7 +38,7 @@ window.AppConfig = {
"bugsnagEnv": "development"
},
"name": "Phoenix Code",
"version": "3.11.0-20763",
"version": "3.11.0-20767",
"apiVersion": "3.11.0",
"homepage": "https://core.ai",
"issues": {
Expand Down
Binary file modified assets/default-project/en.zip
Binary file not shown.
Binary file modified assets/sample-projects/HTML5.zip
Binary file not shown.
Binary file modified assets/sample-projects/bootstrap-blog.zip
Binary file not shown.
Binary file modified assets/sample-projects/dashboard.zip
Binary file not shown.
Binary file modified assets/sample-projects/explore.zip
Binary file not shown.
Binary file modified assets/sample-projects/home-pages.zip
Binary file not shown.
113 changes: 107 additions & 6 deletions brackets-min.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ define(function (require, exports, module) {
require("language/JSONUtils");
require("widgets/InlineMenu");
require("thirdparty/tinycolor");
require("utils/LocalizationUtils");

// DEPRECATED: In future we want to remove the global CodeMirror, but for now we
// expose our required CodeMirror globally so as to avoid breaking extensions in the
Expand Down Expand Up @@ -147602,15 +147603,13 @@ define("utils/KeyEvent", {
*
*/

/**
* Utilities functions related to localization/i18n
*/
define("utils/LocalizationUtils", function (require, exports, module) {
// @INCLUDE_IN_API_DOCS

define("utils/LocalizationUtils", function (require, exports, module) {

var Strings = require("strings");
const Strings = require("strings");

/*
/**
* Converts a language code to its written name, if possible.
* If not possible, the language code is simply returned.
*
Expand All @@ -147624,9 +147623,111 @@ define("utils/LocalizationUtils", function (require, exports, module) {
return i18n === undefined ? locale : i18n;
}

const DATE_TIME_STYLE = {
FULL: "full",
LONG: "long",
MEDIUM: "medium",
SHORT: "short"
};

/**
* Formats a given date object into a locale-aware date and time string.
*
* @param {Date} [date] - The date object to format. If not provided, the current date and time will be used.
* @param {string} [lang] - Optional language code to use for formatting (e.g., 'en', 'fr').
* If not provided, defaults to the application locale or 'en'.
* @param {Object} [dateTimeFormat] - Optional object specifying the date and time formatting options.
* Defaults to { dateStyle: 'medium', timeStyle: 'short' }.
* @param {string} [dateTimeFormat.dateStyle] - Specifies the date format style. One of: DATE_TIME_STYLE.*
* @param {string} [dateTimeFormat.timeStyle] - Specifies the time format style. One of: DATE_TIME_STYLE.*
* @returns {string} - The formatted date and time string (e.g., "Dec 24, 2024, 10:30 AM").
*/
function getFormattedDateTime(date, lang, dateTimeFormat) {
if(!date){
date = new Date();
}
if(!dateTimeFormat){
dateTimeFormat = {
dateStyle: DATE_TIME_STYLE.MEDIUM,
timeStyle: DATE_TIME_STYLE.SHORT
};
}
return Intl.DateTimeFormat([lang || brackets.getLocale() || "en", "en"], dateTimeFormat).format(date);
}

/**
* Returns a relative time string (e.g., "2 days ago", "in 3 hours") based on the difference between the given date and now.
*
* @param {Date} [date] - The date to compare with the current date and time. If not given, defaults to now.
* @param {string} [lang] - Optional language code to use for formatting (e.g., 'en', 'fr').
* If not provided, defaults to the application locale or 'en'.
* @returns {string} - A human-readable relative time string (e.g., "2 days ago", "in 3 hours").
*/
function dateTimeFromNow(date, lang) {
date = date || new Date();
const now = new Date();
const diffInSeconds = Math.floor((date - now) / 1000);

const rtf = new Intl.RelativeTimeFormat([lang || brackets.getLocale() || "en", "en"],
{ numeric: 'auto' });

if (Math.abs(diffInSeconds) < 60) {
return rtf.format(diffInSeconds, 'second');
} else if (Math.abs(diffInSeconds) < 3600) {
return rtf.format(Math.floor(diffInSeconds / 60), 'minute');
} else if (Math.abs(diffInSeconds) < 86400) {
return rtf.format(Math.floor(diffInSeconds / 3600), 'hour');
} else if (Math.abs(diffInSeconds) < 2592000) {
return rtf.format(Math.floor(diffInSeconds / 86400), 'day');
} else if (Math.abs(diffInSeconds) < 31536000) {
return rtf.format(Math.floor(diffInSeconds / 2592000), 'month');
} else {
return rtf.format(Math.floor(diffInSeconds / 31536000), 'year');
}
}

/**
* Returns an intelligent date string.
* - For dates within the last 30 days or the future: relative time (e.g., "2 days ago", "in 3 hours").
* - For dates earlier this year: formatted date (e.g., "Jan 5").
* - For dates not in the current year: formatted date with year (e.g., "Jan 5, 2023").
*
* @param {Date} date - The date to compare and format.
* @param {string} [lang] - Optional language code to use for formatting (e.g., 'en', 'fr').
* @returns {string} - An intelligently formatted date string.
*/
function dateTimeFromNowFriendly(date, lang) {
const now = new Date();
const diffInMilliseconds = date - now;
const diffInDays = Math.floor(diffInMilliseconds / (1000 * 60 * 60 * 24));

// If within the last 30 days or the future, use relative time
if (Math.abs(diffInDays) <= 30) {
return dateTimeFromNow(date, lang);
}

// If in the current year, format as "MMM DD"
const currentYear = now.getFullYear();
const dateYear = date.getFullYear();

const languageOption = [lang || brackets.getLocale() || "en", "en"];

if (currentYear === dateYear) {
return new Intl.DateTimeFormat(languageOption, { month: "short", day: "numeric" }).format(date);
}

// For dates in previous years, format as "MMM DD, YYYY"
return new Intl.DateTimeFormat(languageOption,
{ month: "short", day: "numeric", year: "numeric" }).format(date);
}

// Define public API
exports.getLocalizedLabel = getLocalizedLabel;
exports.getFormattedDateTime = getFormattedDateTime;
exports.dateTimeFromNow = dateTimeFromNow;
exports.dateTimeFromNowFriendly = dateTimeFromNowFriendly;
// public constants
exports.DATE_TIME_STYLE = DATE_TIME_STYLE;
});

/*
Expand Down
1 change: 1 addition & 0 deletions brackets.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ define(function (require, exports, module) {
require("language/JSONUtils");
require("widgets/InlineMenu");
require("thirdparty/tinycolor");
require("utils/LocalizationUtils");

// DEPRECATED: In future we want to remove the global CodeMirror, but for now we
// expose our required CodeMirror globally so as to avoid breaking extensions in the
Expand Down
28 changes: 14 additions & 14 deletions cacheManifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"appConfig.js": "5d4f126050419ef4ad65486743cc821f41cf8e91038dac5821e1402699d92c59",
"assets/default-project/en.zip": "46d88cdccf07581782081414e342fb219228ba229e2e60dca8cb90dadfd11378",
"appConfig.js": "4f81c209755e9d7d5c51054fa16a54da08dec471e3d6ad21c6798dc1dfed4292",
"assets/default-project/en.zip": "a4b4cdf07d94cd2d09c2db06a66309eeadafab9a8a78c12ec59ae1080cec7600",
"assets/default-project/en/images/cloud1.svg": "527399dadfa3357c3ee1a63d6c1c7dda81ecebb832f7383db26f1aaeaf722a8d",
"assets/default-project/en/images/cloud2.svg": "8127c63c0987bc674e2d25f7d24ead017853326c1e43d07706fec46091904418",
"assets/default-project/en/images/cloud3.svg": "15de53aa41dea3b0f685292814563f97213a9736c3cec2f8e17b5d9d45b3ae3d",
Expand Down Expand Up @@ -125,7 +125,7 @@
"assets/pwa/32x32.png": "4f8f75bfcdb6efbbed1732f49edab4e292274cdeb1841e285ccc8194f4c9d8ac",
"assets/pwa/phoenix.png": "d292bf76d6d61fdece2f97fb4cd71b8b0060d1058e9c1d02c94bfb20da8b7f0d",
"assets/pwa/Square284x284Logo.png": "9887c2967039b4fae1214817925f1fb4f9227cba12d37612457c1c8ee1110c67",
"assets/sample-projects/bootstrap-blog.zip": "c3e5e30c0cd9c79301e94b2d5c2206d1e43aa7b2ec502becee6faa25013ca71e",
"assets/sample-projects/bootstrap-blog.zip": "8f31abc76cf9d001c0b986bffc7697ab501be5ab7f55245929672297ee9526ab",
"assets/sample-projects/bootstrap-blog/assets/brand/bootstrap-logo-white.svg": "203d56e7e5e15d8203e596d4a711cec986f6380064591de21850f4563fb840bf",
"assets/sample-projects/bootstrap-blog/assets/brand/bootstrap-logo.svg": "df11d37a123e36a768f2a6064973c4c6ab17d1e3c6501c8bf434ca5c0134c9a2",
"assets/sample-projects/bootstrap-blog/assets/dist/css/bootstrap.min.css": "fb1763b59f9f5764294b5af9fa5250835ae608282fe6f2f2213a5952aacf1fbf",
Expand All @@ -135,7 +135,7 @@
"assets/sample-projects/bootstrap-blog/blog.rtl.css": "33f49d02bbcb2e78f019b7582408fad2b5a76a2ecf79fe09d5b3c08c6ee3872b",
"assets/sample-projects/bootstrap-blog/index-rtl.html": "c582278884060098ff51b9d350b0739e1a0396debdc76772c62b6ec375b6efcb",
"assets/sample-projects/bootstrap-blog/index.html": "f4716c2affa299a27ab6f8c74c22fe67564f1b1d36ff2f0b322672bf0479d739",
"assets/sample-projects/dashboard.zip": "baedbd094a1f8eb45162ded4d6bec163859a099830ab74df980d9cea4ccadf73",
"assets/sample-projects/dashboard.zip": "d7f540c0b2e18f9867a500f1a1d1b2cb370f560f2e0a9230ef62641e678531cb",
"assets/sample-projects/dashboard/assets/brand/bootstrap-logo-white.svg": "203d56e7e5e15d8203e596d4a711cec986f6380064591de21850f4563fb840bf",
"assets/sample-projects/dashboard/assets/brand/bootstrap-logo.svg": "df11d37a123e36a768f2a6064973c4c6ab17d1e3c6501c8bf434ca5c0134c9a2",
"assets/sample-projects/dashboard/assets/dist/css/bootstrap.min.css": "fb1763b59f9f5764294b5af9fa5250835ae608282fe6f2f2213a5952aacf1fbf",
Expand All @@ -147,7 +147,7 @@
"assets/sample-projects/dashboard/index.html": "1fb0c934f816d728cad85e180f78369679dc9edb1eca2d5c625b9360e6264235",
"assets/sample-projects/dashboard/signin.css": "083bef710a6170a5112ce257c2ecf8580ca97ce19136d770f10460e5b85862de",
"assets/sample-projects/dashboard/signin.html": "8c602e656631aeee624673397c0dc00c339498914ed930ab177478c4662a8d26",
"assets/sample-projects/explore.zip": "b427c2faed851753a6aad5e9de6ce53d9ca7ccb96a7968d42d58d5ea3a81a05e",
"assets/sample-projects/explore.zip": "7829aa6a5248ee12a6cc5c96b8a1b9dbfa4f6c0af3bc684b4f2a27930d865b95",
"assets/sample-projects/explore/A-tribute-page.html": "bd510c60f444058b7fcb71d83841f32b1cb5193c1a39421d7739bd6af9fef248",
"assets/sample-projects/explore/adjustable-fireworks.html": "11e69bb2dd8708ed8fbf1acc62b0aaaf88c7ffec859ee958dc1ae51cd53ddac8",
"assets/sample-projects/explore/ant_colony.html": "bc9435ed1b9868f2fbc7212d526f7532c533a5fdf45da988fa5e575bc5f363b7",
Expand Down Expand Up @@ -236,7 +236,7 @@
"assets/sample-projects/explore/watermelon-pixel.html": "765a3fbffb5db97910512fbabaa7c55c0b52dc8eedfcc630811be39d0af98663",
"assets/sample-projects/explore/webmine.html": "6b808f52812dc03db28483411500c04daf8ee0226f535c600a36999d6b7837c0",
"assets/sample-projects/explore/whack-a-mole.html": "25be94a3640553b4801f80edd49998bae3a360988e8a26ff3bdfdc2a76b77191",
"assets/sample-projects/home-pages.zip": "2efb8b701ab279e4ffb6789eb7c948b4ef34cf9d3f335c62f04520a002634bd3",
"assets/sample-projects/home-pages.zip": "12fb2a5e69c6720fd32a087d7bb9784d2628dd2158db85739cc7261d2a83c757",
"assets/sample-projects/home-pages/album/index.html": "e29a1e96644bc17bab1a7e3724e822d65a479e10df182725ee1afa916efbfdc1",
"assets/sample-projects/home-pages/assets/brand/bootstrap-logo-white.svg": "203d56e7e5e15d8203e596d4a711cec986f6380064591de21850f4563fb840bf",
"assets/sample-projects/home-pages/assets/brand/bootstrap-logo.svg": "df11d37a123e36a768f2a6064973c4c6ab17d1e3c6501c8bf434ca5c0134c9a2",
Expand All @@ -248,19 +248,19 @@
"assets/sample-projects/home-pages/carousel/index.html": "235d650043a09f2954f24e4659f64d99ef3988858567fb2221fb1cf34df057e6",
"assets/sample-projects/home-pages/cover/cover.css": "2fbb596077c570cad7ee9e98fb88f5665e0ecfc11e7085c3e04639ad03f7bc10",
"assets/sample-projects/home-pages/cover/index.html": "759214701ff759432711b3421d80aca692c7a2b4c978c516a0bcd0c81a43f381",
"assets/sample-projects/HTML5.zip": "c0d1e251f0c811abf6745add24670650b99c2378ed0a92ac97029a1b19c0a30f",
"assets/sample-projects/HTML5.zip": "0ce0a22b39db4583aa086450919130e86438c824773d8c22e849034ec54b95d7",
"assets/sample-projects/HTML5/index.html": "2dc94c7d3e33aeeb44ec4f75bc7df86a5fd19f3121f2fd3638636fbf7c476c6a",
"assets/sample-projects/HTML5/script.js": "c49e4b01cded4defbc21f5d5d0102719ce4cccbe1b9cb19f9232c5a05df658da",
"assets/sample-projects/HTML5/styles.css": "744b85a9c31affbb00976694c4b9c9149b31e575ed9efdec386231d062ae93f2",
"assets/sample-projects/new-project-list.json": "be1c907279163610779b000aa9ea6e4b035e07429203f16445a914c7045f2d64",
"assets/sample-projects/zips/bootstrap.zip": "6f10407c00ce5d598e77f890528743dc645bc28014335483992b481e63fd7b97",
"base-config/keyboard.json": "f3380c609a293a95644965958286b31863d733293824d56b7087fa0ce4c2d618",
"base-config/readme-keyboard.md": "27e98128176dbd060e93b1f321a4ddcd609571b7b8eb8c9112588f4767d08a03",
"brackets-min.js": "66ebb3443d55d85430c2ecc0f629c39cf7f2426757540e01c7a62b1d50d2271f",
"brackets-min.js": "4b75806ab1d82b4d2340e5d233bef80748390c77eb87694802a2a61eb84778dc",
"brackets.config.dist.json": "8faa5c0a82bb4f49784e93d1225dbd5e1fd8ec6ab07b95f5f874c7c7bd7bb234",
"brackets.config.staging.json": "c0e1f22c772c80f4f5756ab947e40538bcaf7fb7f8925834cfd4ef57c55e477a",
"brackets.js": "7b59afe54ff7bd1ae6892f04a8201407ba85439d225ab4c9ae1ed79ecad12fc9",
"cacheManifest.json": "bbe3f205750e1eafa2b4d757f813dd81ef493650858233f3207c725f2f34ac3c",
"brackets.js": "6dee2717d91f84c60a3afa8e6427a96fbcdba0363fbcd0a8d8baea74f13f20bc",
"cacheManifest.json": "ae538e93cb1118051f97dac5b97ef049ef9b84360976bcdef4f9e52ccdbc3076",
"command/ChangeShortcutTemplate.html": "345d682d8bde29380822824778cf09acc79affae6e82b9db00c6205b2b3dd2ee",
"command/CommandManager.js": "10181902fc2e55a780981a17b95c7b579427fdfd12c92ed49df35d3b70f64c15",
"command/Commands.js": "5c9cf28a050af9c156d6cc2e22fdbba6cec1b6e2a2fc5db53799b3fc8bb61b84",
Expand All @@ -269,7 +269,7 @@
"command/KeyboardOverlayMode.js": "7170dfcfca59b41252146ef8a5ca4f652c666e33b7a4b411e30e72951bd35b49",
"command/Keys.js": "36545bbbca56d2a909779c5873fa860bf737977588ad61a398acb86f6bcbe4ee",
"command/Menus.js": "b0c5031f13e4ca6efd594e9fcb973f0e591a1af6cc0c0df8ec32024f6bdd0f08",
"config.json": "94a817b621a21ef3fb8674962355e6efff5b1740a86856859a75ed3e05007f28",
"config.json": "900d1d0b34a601f4ce95be180273fa0645e9239c181abe3a763f320d8a01e2f2",
"desktop-metrics.html": "66f87550ddf04f284a6c1e81567b7dfbefb2b8007f48f0bad7d8f7aacdb11bac",
"devEnable.html": "44aa1a496a8be413299f651e6b0c3e62ac50cd5d40126ad1bb6b70b9b2b818c4",
"document/ChangedDocumentTracker.js": "03b0eaf0995fee6d27c782a8028a1314f61214e383f5f5e198320b2faac4cf40",
Expand Down Expand Up @@ -516,9 +516,9 @@
"extensions/default/UrlCodeHints/requirejs-config.json": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
"extensions/default/UrlCodeHints/unittests.js": "c60ecbe81555d435437dc5b7294f4e89b3befb7b34d60c44285c6009807c29c2",
"extensions/dev/README.md": "3fd897e55e0e05e503c898555cfa3b20e820b32946fc7c426ea9bb2afbed449f",
"extensions/registry/popularity.json": "76aa4d53cbcbcf2d4210224182661c058b19448b6301b2f0362e787d8e9d461f",
"extensions/registry/popularity.json": "a76002aa58c44e695a6f427548f93b55ff98a4bc14ed6d7b5bc7a69a86130a01",
"extensions/registry/registry_version.json": "a8ca8a3f794537c31fea35762e2df5b506215df51a899ff8f439ea20aa508eb6",
"extensions/registry/registry.json": "6a18e0703de8bf31dbbdfae72a336c630989c26ad9065b7a7c1f4b5aa2762097",
"extensions/registry/registry.json": "75b5b547ed2ca899029fd85bd686b8e562d342c6398755e63ebe1efe88fe1307",
"extensions/samples/BracketsConfigCentral/htmlContent/Config.html": "6ac3ce03e2fb8913ec5da3e8835c0646894f242600c64d95b77c7d7dc0a156f7",
"extensions/samples/BracketsConfigCentral/htmlContent/logo-sm.png": "006f025fecd24c292e87a1eb0e123ee21178ec9c09517a1f16fe362fe2fbcbb5",
"extensions/samples/BracketsConfigCentral/main.js": "f2c36decadb7d98e2a89cfdb9aff8a74cc130ea8c3ad084b7af62ee21e3a8181",
Expand Down Expand Up @@ -1747,7 +1747,7 @@
"utils/FeatureGate.js": "5dd72e889df733efc992a2236c5d09dd7587203244712266318ed7e4521dc29c",
"utils/Global.js": "5eaa3f2022b20668b0c2a37b201f5db8cfb3c692ecb3079d9ebffdb1306fbd18",
"utils/KeyEvent.js": "701155ac32f5bf05f7d2ad24f825ae3a6d4313a387ae4bb01cf8aff6bd3e616f",
"utils/LocalizationUtils.js": "ba39bfb6d3f788fa5b9ad4b74dd291c9531284d2d4e95d3d674c837d38db89d8",
"utils/LocalizationUtils.js": "41bd7fb7da71d07e782c21bec7ff29ee8157fba83ae7ac65e7de763b8fff3293",
"utils/Metrics.js": "7954e37700796acff0ee78235776ca650a91b9ae13c07fdd7a50b27636836c56",
"utils/NativeApp.js": "2e26094168aaba67ce86fb90cfc57bb69957e0e08582ac34a1f4506c64cdfee6",
"utils/NodeConnection.js": "e57de9190f6ffa6941224df69bd1fa45d6d98756c609704fd9d2f250c2576306",
Expand Down
4 changes: 2 additions & 2 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"app_notification_url": "assets/notifications/dev/",
"app_update_url": "https://updates.phcode.io/tauri/update-latest-experimental-build.json",
"linting.enabled_by_default": true,
"build_timestamp": "2024-12-25T06:07:45.665Z",
"build_timestamp": "2024-12-25T16:15:20.010Z",
"googleAnalyticsID": "G-P4HJFPDB76",
"googleAnalyticsIDDesktop": "G-VE5BXWJ0HF",
"mixPanelID": "49c4d164b592be2350fc7af06a259bf3",
Expand All @@ -37,7 +37,7 @@
"bugsnagEnv": "development"
},
"name": "Phoenix Code",
"version": "3.11.0-20763",
"version": "3.11.0-20767",
"apiVersion": "3.11.0",
"homepage": "https://core.ai",
"issues": {
Expand Down
2 changes: 1 addition & 1 deletion extensions/registry/popularity.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion extensions/registry/registry.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions src/appConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ window.AppConfig = {
"app_notification_url": "assets/notifications/dev/",
"app_update_url": "https://updates.phcode.io/tauri/update-latest-experimental-build.json",
"linting.enabled_by_default": true,
"build_timestamp": "2024-12-25T06:07:45.665Z",
"build_timestamp": "2024-12-25T16:15:20.010Z",
"googleAnalyticsID": "G-P4HJFPDB76",
"googleAnalyticsIDDesktop": "G-VE5BXWJ0HF",
"mixPanelID": "49c4d164b592be2350fc7af06a259bf3",
Expand All @@ -38,7 +38,7 @@ window.AppConfig = {
"bugsnagEnv": "development"
},
"name": "Phoenix Code",
"version": "3.11.0-20763",
"version": "3.11.0-20767",
"apiVersion": "3.11.0",
"homepage": "https://core.ai",
"issues": {
Expand Down
Binary file modified src/assets/default-project/en.zip
Binary file not shown.
Binary file modified src/assets/sample-projects/HTML5.zip
Binary file not shown.
Binary file modified src/assets/sample-projects/bootstrap-blog.zip
Binary file not shown.
Binary file modified src/assets/sample-projects/dashboard.zip
Binary file not shown.
Binary file modified src/assets/sample-projects/explore.zip
Binary file not shown.
Binary file modified src/assets/sample-projects/home-pages.zip
Binary file not shown.
Loading

0 comments on commit 5a51ba9

Please sign in to comment.