UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

138 lines (131 loc) 18.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.coordHasLength4 = coordHasLength4; exports.getAnimationDomainFromTimestamps = getAnimationDomainFromTimestamps; exports.isTripGeoJsonField = isTripGeoJsonField; exports.parseTripGeoJsonTimestamp = parseTripGeoJsonTimestamp; var _geojsonUtils = require("../geojson-layer/geojson-utils"); var _utils = require("@kepler.gl/utils"); var _commonUtils = require("@kepler.gl/common-utils"); // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /** * Parse geojson from string * @param {array} samples feature object values * @returns whether the geometry coordinates has length of 4 */ function coordHasLength4(samples) { var hasLength4 = true; for (var i = 0; i < samples.length; i += 1) { var _samples$i; hasLength4 = Array.isArray((_samples$i = samples[i]) === null || _samples$i === void 0 || (_samples$i = _samples$i.geometry) === null || _samples$i === void 0 ? void 0 : _samples$i.coordinates) && !samples[i].geometry.coordinates.find(function (c) { return c.length < 4; }); if (!hasLength4) { break; } } return hasLength4; } /** * Check if geojson features are trip layer animatable by meeting 3 conditions * @param dataContainer geojson feature objects container * @param {object} field array of geojson feature objects * @returns whether it is trip layer animatable */ function isTripGeoJsonField(dataContainer, field) { if (dataContainer.numRows() < 1) { return false; } var maxCount = 10000; var sampleRawFeatures = dataContainer.numRows() > maxCount ? (0, _utils.getSampleContainerData)(dataContainer, maxCount) : dataContainer; var features = sampleRawFeatures.mapIndex(field.valueAccessor).map(_geojsonUtils.parseGeoJsonRawFeature).filter(_commonUtils.notNullorUndefined); var featureTypes = (0, _geojsonUtils.getGeojsonFeatureTypes)(features); // condition 1: contain line string if (!featureTypes.line) { return false; } // condition 2:sample line strings contain 4 coordinates if (!coordHasLength4(features)) { return false; } var geom = features[0].geometry; if (!geom || geom.type === 'GeometryCollection' || !('coordinates' in geom)) { return false; } var tsHolder = geom.coordinates.map(function (coord) { return String(coord[3]); }); return Boolean((0, _commonUtils.containValidTime)(tsHolder)); } /** * Get unix timestamp from animatable geojson for deck.gl trip layer * @param dataToFeature array of geojson feature objects, can be null * @returns */ function parseTripGeoJsonTimestamp(dataToFeature) { // Analyze type based on coordinates of the 1st lineString // select a sample trip to analyze time format var empty = { dataToTimeStamp: [], animationDomain: null }; var sampleTrip = dataToFeature.find(function (f) { var _f$geometry; return (f === null || f === void 0 || (_f$geometry = f.geometry) === null || _f$geometry === void 0 || (_f$geometry = _f$geometry.coordinates) === null || _f$geometry === void 0 || (_f$geometry = _f$geometry[0]) === null || _f$geometry === void 0 ? void 0 : _f$geometry.length) > 3; }); // if no valid geometry if (!sampleTrip) { return empty; } var analyzedType = (0, _commonUtils.containValidTime)(sampleTrip.geometry.coordinates.map(function (coord) { return coord[3]; })); if (!analyzedType) { return empty; } var format = analyzedType.format; var getTimeValue = function getTimeValue(coord) { return coord && (0, _commonUtils.notNullorUndefined)(coord[3]) ? (0, _utils.timeToUnixMilli)(coord[3], format) : null; }; var dataToTimeStamp = dataToFeature.map(function (f) { return f && f.geometry && Array.isArray(f.geometry.coordinates) ? f.geometry.coordinates.map(getTimeValue) : null; }); var animationDomain = getAnimationDomainFromTimestamps(dataToTimeStamp); return { dataToTimeStamp: dataToTimeStamp, animationDomain: animationDomain }; } function findMinFromSorted(list) { // check if list is null since the default value [] will only be applied when the param is undefined return (list === null || list === void 0 ? void 0 : list.find(function (d) { return (0, _commonUtils.notNullorUndefined)(d) && Number.isFinite(d); })) || null; } function findMaxFromSorted() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var i = list.length - 1; while (i > 0) { if ((0, _commonUtils.notNullorUndefined)(list[i]) && Number.isFinite(list[i])) { return list[i]; } i--; } return null; } function getAnimationDomainFromTimestamps() { var dataToTimeStamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return dataToTimeStamp.reduce(function (accu, tss) { var tsMin = findMinFromSorted(tss); var tsMax = findMaxFromSorted(tss); if ((0, _commonUtils.notNullorUndefined)(tsMin) && (0, _commonUtils.notNullorUndefined)(tsMax) && Number.isFinite(tsMin) && Number.isFinite(tsMax)) { accu[0] = Math.min(accu[0], tsMin); accu[1] = Math.max(accu[1], tsMax); } return accu; }, [Infinity, -Infinity]); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2VvanNvblV0aWxzIiwicmVxdWlyZSIsIl91dGlscyIsIl9jb21tb25VdGlscyIsImNvb3JkSGFzTGVuZ3RoNCIsInNhbXBsZXMiLCJoYXNMZW5ndGg0IiwiaSIsImxlbmd0aCIsIl9zYW1wbGVzJGkiLCJBcnJheSIsImlzQXJyYXkiLCJnZW9tZXRyeSIsImNvb3JkaW5hdGVzIiwiZmluZCIsImMiLCJpc1RyaXBHZW9Kc29uRmllbGQiLCJkYXRhQ29udGFpbmVyIiwiZmllbGQiLCJudW1Sb3dzIiwibWF4Q291bnQiLCJzYW1wbGVSYXdGZWF0dXJlcyIsImdldFNhbXBsZUNvbnRhaW5lckRhdGEiLCJmZWF0dXJlcyIsIm1hcEluZGV4IiwidmFsdWVBY2Nlc3NvciIsIm1hcCIsInBhcnNlR2VvSnNvblJhd0ZlYXR1cmUiLCJmaWx0ZXIiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJmZWF0dXJlVHlwZXMiLCJnZXRHZW9qc29uRmVhdHVyZVR5cGVzIiwibGluZSIsImdlb20iLCJ0eXBlIiwidHNIb2xkZXIiLCJjb29yZCIsIlN0cmluZyIsIkJvb2xlYW4iLCJjb250YWluVmFsaWRUaW1lIiwicGFyc2VUcmlwR2VvSnNvblRpbWVzdGFtcCIsImRhdGFUb0ZlYXR1cmUiLCJlbXB0eSIsImRhdGFUb1RpbWVTdGFtcCIsImFuaW1hdGlvbkRvbWFpbiIsInNhbXBsZVRyaXAiLCJmIiwiX2YkZ2VvbWV0cnkiLCJhbmFseXplZFR5cGUiLCJmb3JtYXQiLCJnZXRUaW1lVmFsdWUiLCJ0aW1lVG9Vbml4TWlsbGkiLCJnZXRBbmltYXRpb25Eb21haW5Gcm9tVGltZXN0YW1wcyIsImZpbmRNaW5Gcm9tU29ydGVkIiwibGlzdCIsImQiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImZpbmRNYXhGcm9tU29ydGVkIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicmVkdWNlIiwiYWNjdSIsInRzcyIsInRzTWluIiwidHNNYXgiLCJNYXRoIiwibWluIiwibWF4IiwiSW5maW5pdHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdHJpcC1sYXllci90cmlwLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7cGFyc2VHZW9Kc29uUmF3RmVhdHVyZSwgZ2V0R2VvanNvbkZlYXR1cmVUeXBlc30gZnJvbSAnLi4vZ2VvanNvbi1sYXllci9nZW9qc29uLXV0aWxzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgZ2V0U2FtcGxlQ29udGFpbmVyRGF0YSwgdGltZVRvVW5peE1pbGxpfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7Y29udGFpblZhbGlkVGltZSwgbm90TnVsbG9yVW5kZWZpbmVkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5pbXBvcnQge0ZlYXR1cmV9IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuaW1wb3J0IHtHZW9Kc29uUHJvcGVydGllcywgR2VvbWV0cnl9IGZyb20gJ2dlb2pzb24nO1xuXG4vKipcbiAqIFBhcnNlIGdlb2pzb24gZnJvbSBzdHJpbmdcbiAqIEBwYXJhbSB7YXJyYXl9IHNhbXBsZXMgZmVhdHVyZSBvYmplY3QgdmFsdWVzXG4gKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBnZW9tZXRyeSBjb29yZGluYXRlcyBoYXMgbGVuZ3RoIG9mIDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkSGFzTGVuZ3RoNChzYW1wbGVzKTogYm9vbGVhbiB7XG4gIGxldCBoYXNMZW5ndGg0ID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaGFzTGVuZ3RoNCA9XG4gICAgICBBcnJheS5pc0FycmF5KHNhbXBsZXNbaV0/Lmdlb21ldHJ5Py5jb29yZGluYXRlcykgJiZcbiAgICAgICFzYW1wbGVzW2ldLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmZpbmQoYyA9PiBjLmxlbmd0aCA8IDQpO1xuXG4gICAgaWYgKCFoYXNMZW5ndGg0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc0xlbmd0aDQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgZ2VvanNvbiBmZWF0dXJlcyBhcmUgdHJpcCBsYXllciBhbmltYXRhYmxlIGJ5IG1lZXRpbmcgMyBjb25kaXRpb25zXG4gKiBAcGFyYW0gZGF0YUNvbnRhaW5lciBnZW9qc29uIGZlYXR1cmUgb2JqZWN0cyBjb250YWluZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZCBhcnJheSBvZiBnZW9qc29uIGZlYXR1cmUgb2JqZWN0c1xuICogQHJldHVybnMgd2hldGhlciBpdCBpcyB0cmlwIGxheWVyIGFuaW1hdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJpcEdlb0pzb25GaWVsZChkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBmaWVsZCk6IGJvb2xlYW4ge1xuICBpZiAoZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkgPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWF4Q291bnQgPSAxMDAwMDtcbiAgY29uc3Qgc2FtcGxlUmF3RmVhdHVyZXMgPVxuICAgIGRhdGFDb250YWluZXIubnVtUm93cygpID4gbWF4Q291bnRcbiAgICAgID8gZ2V0U2FtcGxlQ29udGFpbmVyRGF0YShkYXRhQ29udGFpbmVyLCBtYXhDb3VudClcbiAgICAgIDogZGF0YUNvbnRhaW5lcjtcblxuICBjb25zdCBmZWF0dXJlczogRmVhdHVyZTxHZW9tZXRyeSwgR2VvSnNvblByb3BlcnRpZXM+W10gPSBzYW1wbGVSYXdGZWF0dXJlc1xuICAgIC5tYXBJbmRleChmaWVsZC52YWx1ZUFjY2Vzc29yKVxuICAgIC5tYXAocGFyc2VHZW9Kc29uUmF3RmVhdHVyZSlcbiAgICAuZmlsdGVyKG5vdE51bGxvclVuZGVmaW5lZCk7XG4gIGNvbnN0IGZlYXR1cmVUeXBlcyA9IGdldEdlb2pzb25GZWF0dXJlVHlwZXMoZmVhdHVyZXMpO1xuXG4gIC8vIGNvbmRpdGlvbiAxOiBjb250YWluIGxpbmUgc3RyaW5nXG4gIGlmICghZmVhdHVyZVR5cGVzLmxpbmUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBjb25kaXRpb24gMjpzYW1wbGUgbGluZSBzdHJpbmdzIGNvbnRhaW4gNCBjb29yZGluYXRlc1xuICBpZiAoIWNvb3JkSGFzTGVuZ3RoNChmZWF0dXJlcykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBnZW9tID0gZmVhdHVyZXNbMF0uZ2VvbWV0cnk7XG4gIGlmICghZ2VvbSB8fCBnZW9tLnR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nIHx8ICEoJ2Nvb3JkaW5hdGVzJyBpbiBnZW9tKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB0c0hvbGRlciA9IChnZW9tLmNvb3JkaW5hdGVzIGFzIG51bWJlcltdW10pLm1hcChjb29yZCA9PiBTdHJpbmcoY29vcmRbM10pKTtcblxuICByZXR1cm4gQm9vbGVhbihjb250YWluVmFsaWRUaW1lKHRzSG9sZGVyKSk7XG59XG5cbi8qKlxuICogR2V0IHVuaXggdGltZXN0YW1wIGZyb20gYW5pbWF0YWJsZSBnZW9qc29uIGZvciBkZWNrLmdsIHRyaXAgbGF5ZXJcbiAqIEBwYXJhbSBkYXRhVG9GZWF0dXJlIGFycmF5IG9mIGdlb2pzb24gZmVhdHVyZSBvYmplY3RzLCBjYW4gYmUgbnVsbFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVHJpcEdlb0pzb25UaW1lc3RhbXAoZGF0YVRvRmVhdHVyZTogYW55W10pIHtcbiAgLy8gQW5hbHl6ZSB0eXBlIGJhc2VkIG9uIGNvb3JkaW5hdGVzIG9mIHRoZSAxc3QgbGluZVN0cmluZ1xuICAvLyBzZWxlY3QgYSBzYW1wbGUgdHJpcCB0byBhbmFseXplIHRpbWUgZm9ybWF0XG4gIGNvbnN0IGVtcHR5ID0ge2RhdGFUb1RpbWVTdGFtcDogW10sIGFuaW1hdGlvbkRvbWFpbjogbnVsbH07XG4gIGNvbnN0IHNhbXBsZVRyaXAgPSBkYXRhVG9GZWF0dXJlLmZpbmQoZiA9PiBmPy5nZW9tZXRyeT8uY29vcmRpbmF0ZXM/LlswXT8ubGVuZ3RoID4gMyk7XG5cbiAgLy8gaWYgbm8gdmFsaWQgZ2VvbWV0cnlcbiAgaWYgKCFzYW1wbGVUcmlwKSB7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgY29uc3QgYW5hbHl6ZWRUeXBlID0gY29udGFpblZhbGlkVGltZShzYW1wbGVUcmlwLmdlb21ldHJ5LmNvb3JkaW5hdGVzLm1hcChjb29yZCA9PiBjb29yZFszXSkpO1xuXG4gIGlmICghYW5hbHl6ZWRUeXBlKSB7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgY29uc3Qge2Zvcm1hdH0gPSBhbmFseXplZFR5cGU7XG4gIGNvbnN0IGdldFRpbWVWYWx1ZSA9IGNvb3JkID0+XG4gICAgY29vcmQgJiYgbm90TnVsbG9yVW5kZWZpbmVkKGNvb3JkWzNdKSA/IHRpbWVUb1VuaXhNaWxsaShjb29yZFszXSwgZm9ybWF0KSA6IG51bGw7XG5cbiAgY29uc3QgZGF0YVRvVGltZVN0YW1wOiBudW1iZXJbXVtdID0gZGF0YVRvRmVhdHVyZS5tYXAoZiA9PlxuICAgIGYgJiYgZi5nZW9tZXRyeSAmJiBBcnJheS5pc0FycmF5KGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMpXG4gICAgICA/IGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKGdldFRpbWVWYWx1ZSlcbiAgICAgIDogbnVsbFxuICApO1xuXG4gIGNvbnN0IGFuaW1hdGlvbkRvbWFpbiA9IGdldEFuaW1hdGlvbkRvbWFpbkZyb21UaW1lc3RhbXBzKGRhdGFUb1RpbWVTdGFtcCk7XG5cbiAgcmV0dXJuIHtkYXRhVG9UaW1lU3RhbXAsIGFuaW1hdGlvbkRvbWFpbn07XG59XG5cbmZ1bmN0aW9uIGZpbmRNaW5Gcm9tU29ydGVkKGxpc3Q6IG51bWJlcltdKSB7XG4gIC8vIGNoZWNrIGlmIGxpc3QgaXMgbnVsbCBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBbXSB3aWxsIG9ubHkgYmUgYXBwbGllZCB3aGVuIHRoZSBwYXJhbSBpcyB1bmRlZmluZWRcbiAgcmV0dXJuIGxpc3Q/LmZpbmQoZCA9PiBub3ROdWxsb3JVbmRlZmluZWQoZCkgJiYgTnVtYmVyLmlzRmluaXRlKGQpKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTWF4RnJvbVNvcnRlZChsaXN0OiBudW1iZXJbXSA9IFtdKSB7XG4gIGxldCBpID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaSA+IDApIHtcbiAgICBpZiAobm90TnVsbG9yVW5kZWZpbmVkKGxpc3RbaV0pICYmIE51bWJlci5pc0Zpbml0ZShsaXN0W2ldKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaV07XG4gICAgfVxuICAgIGktLTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuaW1hdGlvbkRvbWFpbkZyb21UaW1lc3RhbXBzKGRhdGFUb1RpbWVTdGFtcDogbnVtYmVyW11bXSA9IFtdKSB7XG4gIHJldHVybiBkYXRhVG9UaW1lU3RhbXAucmVkdWNlKFxuICAgIChhY2N1OiBbbnVtYmVyLCBudW1iZXJdLCB0c3MpID0+IHtcbiAgICAgIGNvbnN0IHRzTWluID0gZmluZE1pbkZyb21Tb3J0ZWQodHNzKTtcbiAgICAgIGNvbnN0IHRzTWF4ID0gZmluZE1heEZyb21Tb3J0ZWQodHNzKTtcbiAgICAgIGlmIChcbiAgICAgICAgbm90TnVsbG9yVW5kZWZpbmVkKHRzTWluKSAmJlxuICAgICAgICBub3ROdWxsb3JVbmRlZmluZWQodHNNYXgpICYmXG4gICAgICAgIE51bWJlci5pc0Zpbml0ZSh0c01pbikgJiZcbiAgICAgICAgTnVtYmVyLmlzRmluaXRlKHRzTWF4KVxuICAgICAgKSB7XG4gICAgICAgIGFjY3VbMF0gPSBNYXRoLm1pbihhY2N1WzBdLCB0c01pbik7XG4gICAgICAgIGFjY3VbMV0gPSBNYXRoLm1heChhY2N1WzFdLCB0c01heCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9LFxuICAgIFtJbmZpbml0eSwgLUluZmluaXR5XVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFGLE9BQUE7QUFMQTtBQUNBOztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxlQUFlQSxDQUFDQyxPQUFPLEVBQVc7RUFDaEQsSUFBSUMsVUFBVSxHQUFHLElBQUk7RUFDckIsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdGLE9BQU8sQ0FBQ0csTUFBTSxFQUFFRCxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQUEsSUFBQUUsVUFBQTtJQUMxQ0gsVUFBVSxHQUNSSSxLQUFLLENBQUNDLE9BQU8sRUFBQUYsVUFBQSxHQUFDSixPQUFPLENBQUNFLENBQUMsQ0FBQyxjQUFBRSxVQUFBLGdCQUFBQSxVQUFBLEdBQVZBLFVBQUEsQ0FBWUcsUUFBUSxjQUFBSCxVQUFBLHVCQUFwQkEsVUFBQSxDQUFzQkksV0FBVyxDQUFDLElBQ2hELENBQUNSLE9BQU8sQ0FBQ0UsQ0FBQyxDQUFDLENBQUNLLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDQyxJQUFJLENBQUMsVUFBQUMsQ0FBQztNQUFBLE9BQUlBLENBQUMsQ0FBQ1AsTUFBTSxHQUFHLENBQUM7SUFBQSxFQUFDO0lBRTFELElBQUksQ0FBQ0YsVUFBVSxFQUFFO01BQ2Y7SUFDRjtFQUNGO0VBQ0EsT0FBT0EsVUFBVTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxrQkFBa0JBLENBQUNDLGFBQXFDLEVBQUVDLEtBQUssRUFBVztFQUN4RixJQUFJRCxhQUFhLENBQUNFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lB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