{"version":3,"file":"exifreader-BprHnjga.js","sources":["../../node_modules/exifreader/src/dataview.js","../../node_modules/exifreader/src/utils.js","../../node_modules/exifreader/src/constants.js","../../node_modules/exifreader/src/tag-names-utils.js","../../node_modules/exifreader/src/byte-order.js","../../node_modules/exifreader/src/image-header-tiff.js","../../node_modules/exifreader/src/image-header-jpeg.js","../../node_modules/exifreader/src/image-header-png.js","../../node_modules/exifreader/src/image-header-iso-bmff-utils.js","../../node_modules/exifreader/src/image-header-iso-bmff-iloc.js","../../node_modules/exifreader/src/image-header-iso-bmff.js","../../node_modules/exifreader/src/image-header-heic.js","../../node_modules/exifreader/src/image-header-avif.js","../../node_modules/exifreader/src/image-header-webp.js","../../node_modules/exifreader/src/image-header-gif.js","../../node_modules/exifreader/src/xml.js","../../node_modules/exifreader/src/image-header.js","../../node_modules/exifreader/src/tag-names-common.js","../../node_modules/exifreader/src/tag-names-0th-ifd.js","../../node_modules/exifreader/src/tag-names-exif-ifd.js","../../node_modules/exifreader/src/tag-names-gps-ifd.js","../../node_modules/exifreader/src/tag-names-interoperability-ifd.js","../../node_modules/exifreader/src/tag-names-mpf-ifd.js","../../node_modules/exifreader/src/tag-names-canon-ifd.js","../../node_modules/exifreader/src/tag-names.js","../../node_modules/exifreader/src/types.js","../../node_modules/exifreader/src/tags-helpers.js","../../node_modules/exifreader/src/tags.js","../../node_modules/exifreader/src/mpf-tags.js","../../node_modules/exifreader/src/file-tags.js","../../node_modules/exifreader/src/jfif-tags.js","../../node_modules/exifreader/src/iptc-tag-names.js","../../node_modules/exifreader/src/text-decoder.js","../../node_modules/exifreader/src/tag-decoder.js","../../node_modules/exifreader/src/iptc-tags.js","../../node_modules/exifreader/src/xmp-tag-names.js","../../node_modules/exifreader/src/dom-parser.js","../../node_modules/exifreader/src/xmp-tags.js","../../node_modules/exifreader/src/photoshop-tag-names.js","../../node_modules/exifreader/src/photoshop-tags.js","../../node_modules/exifreader/src/icc-tag-names.js","../../node_modules/exifreader/src/icc-tags.js","../../node_modules/exifreader/src/canon-tags.js","../../node_modules/exifreader/src/png-file-tags.js","../../node_modules/exifreader/src/png-text-tags.js","../../node_modules/exifreader/src/png-tags.js","../../node_modules/exifreader/src/vp8x-tags.js","../../node_modules/exifreader/src/gif-file-tags.js","../../node_modules/exifreader/src/thumbnail.js","../../node_modules/exifreader/src/errors.js","../../node_modules/exifreader/src/exif-reader.js"],"sourcesContent":["export default class DataView {\n constructor(buffer) {\n if (bufferTypeIsUnsupported(buffer)) {\n throw new Error('DataView: Passed buffer type is unsupported.');\n }\n\n this.buffer = buffer;\n this.byteLength = this.buffer.length;\n }\n\n getUint8(offset) {\n return this.buffer.readUInt8(offset);\n }\n\n getUint16(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt16LE(offset);\n }\n return this.buffer.readUInt16BE(offset);\n }\n\n getUint32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readUInt32LE(offset);\n }\n return this.buffer.readUInt32BE(offset);\n }\n\n getInt32(offset, littleEndian) {\n if (littleEndian) {\n return this.buffer.readInt32LE(offset);\n }\n return this.buffer.readInt32BE(offset);\n }\n}\n\nfunction bufferTypeIsUnsupported(buffer) {\n return typeof buffer !== 'object'\n || buffer.length === undefined\n || buffer.readUInt8 === undefined\n || buffer.readUInt16LE === undefined\n || buffer.readUInt16BE === undefined\n || buffer.readUInt32LE === undefined\n || buffer.readUInt32BE === undefined\n || buffer.readInt32LE === undefined\n || buffer.readInt32BE === undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport DataViewWrapper from './dataview.js';\n\nexport function getDataView(data, byteOffset, byteLength) {\n try {\n return new DataView(data, byteOffset, byteLength);\n } catch (error) {\n return new DataViewWrapper(data, byteOffset, byteLength);\n }\n}\n\nexport function getStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n chars.push(dataView.getUint8(offset + i));\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getNullTerminatedStringFromDataView(dataView, offset) {\n const chars = [];\n let i = 0;\n while (offset + i < dataView.byteLength) {\n const char = dataView.getUint8(offset + i);\n if (char === 0) {\n break;\n }\n chars.push(char);\n i++;\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getUnicodeStringFromDataView(dataView, offset, length) {\n const chars = [];\n for (let i = 0; i < length && offset + i < dataView.byteLength; i += 2) {\n chars.push(dataView.getUint16(offset + i));\n }\n if (chars[chars.length - 1] === 0) {\n chars.pop();\n }\n return getStringValueFromArray(chars);\n}\n\nexport function getPascalStringFromDataView(dataView, offset) {\n const size = dataView.getUint8(offset);\n const string = getStringFromDataView(dataView, offset + 1, size);\n return [size, string];\n}\n\nexport function getStringValueFromArray(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getCharacterArray(string) {\n return string.split('').map((character) => character.charCodeAt(0));\n}\n\nexport function objectAssign() {\n for (let i = 1; i < arguments.length; i++) {\n for (const property in arguments[i]) {\n arguments[0][property] = arguments[i][property];\n }\n }\n\n return arguments[0];\n}\n\nexport function deferInit(object, key, initializer) {\n let initialized = false;\n Object.defineProperty(object, key, {\n get() {\n if (!initialized) {\n initialized = true;\n Object.defineProperty(object, key, {\n configurable: true,\n enumerable: true,\n value: initializer.apply(object),\n writable: true\n });\n }\n return object[key];\n },\n configurable: true,\n enumerable: true\n });\n}\n\nexport function getBase64Image(image) {\n if (typeof btoa !== 'undefined') {\n if (typeof image === 'string') {\n // This only happens during the build tests using Node 16+ (npm run test:build).\n return btoa(image);\n }\n // IE11- does not implement reduce on the Uint8Array prototype.\n return btoa(Array.prototype.reduce.call(new Uint8Array(image), (data, byte) => data + String.fromCharCode(byte), ''));\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(image).toString('base64'); // eslint-disable-line no-undef\n }\n return (new Buffer(image)).toString('base64'); // eslint-disable-line no-undef\n}\n\nexport function dataUriToBuffer(dataUri) {\n const data = dataUri.substring(dataUri.indexOf(',') + 1);\n\n if (dataUri.indexOf(';base64') !== -1) {\n if (typeof atob !== 'undefined') {\n return Uint8Array.from(atob(data), (char) => char.charCodeAt(0)).buffer;\n }\n if (typeof Buffer === 'undefined') {\n return undefined;\n }\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(data, 'base64'); // eslint-disable-line no-undef\n }\n return new Buffer(data, 'base64'); // eslint-disable-line no-undef\n }\n\n const decodedData = decodeURIComponent(data);\n if (typeof Buffer !== 'undefined') {\n if (typeof Buffer.from !== 'undefined') { // eslint-disable-line no-undef\n return Buffer.from(decodedData); // eslint-disable-line no-undef\n }\n return new Buffer(decodedData); // eslint-disable-line no-undef\n }\n return Uint8Array.from(decodedData, (char) => char.charCodeAt(0)).buffer;\n}\n\nexport function padStart(string, length, character) {\n const padding = strRepeat(character, length - string.length);\n return padding + string;\n}\n\nexport function parseFloatRadix(string, radix) {\n return parseInt(string.replace('.', ''), radix)\n / Math.pow(radix, (string.split('.')[1] || '').length);\n}\n\nexport function strRepeat(string, num) {\n return new Array(num + 1).join(string);\n}\n\nexport const COMPRESSION_METHOD_NONE = undefined;\nexport const COMPRESSION_METHOD_DEFLATE = 0;\n\nexport function decompress(dataView, compressionMethod, encoding, returnType = 'string') {\n if (compressionMethod === COMPRESSION_METHOD_DEFLATE) {\n if (typeof DecompressionStream === 'function') {\n const decompressionStream = new DecompressionStream('deflate');\n const decompressedStream = new Blob([dataView]).stream().pipeThrough(decompressionStream);\n if (returnType === 'dataview') {\n return new Response(decompressedStream).arrayBuffer().then((arrayBuffer) => new DataView(arrayBuffer));\n }\n return new Response(decompressedStream).arrayBuffer()\n .then((buffer) => new TextDecoder(encoding).decode(buffer));\n }\n }\n if (compressionMethod !== undefined) {\n return Promise.reject(`Unknown compression method ${compressionMethod}.`);\n }\n return dataView;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n USE_FILE: true,\n USE_JFIF: true,\n USE_PNG_FILE: true,\n USE_EXIF: true,\n USE_IPTC: true,\n USE_XMP: true,\n USE_ICC: true,\n USE_MPF: true,\n USE_PHOTOSHOP: true,\n USE_THUMBNAIL: true,\n USE_TIFF: true,\n USE_JPEG: true,\n USE_PNG: true,\n USE_HEIC: true,\n USE_AVIF: true,\n USE_WEBP: true,\n USE_GIF: true,\n USE_MAKER_NOTES: true\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport function getStringValue(value) {\n return value.map((charCode) => String.fromCharCode(charCode)).join('');\n}\n\nexport function getEncodedString(value) {\n if (value.length >= 8) {\n const encoding = getStringValue(value.slice(0, 8));\n\n if (encoding === 'ASCII\\x00\\x00\\x00') {\n return getStringValue(value.slice(8));\n } else if (encoding === 'JIS\\x00\\x00\\x00\\x00\\x00') {\n return '[JIS encoded text]';\n } else if (encoding === 'UNICODE\\x00') {\n return '[Unicode encoded text]';\n } else if (encoding === '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00') {\n return '[Undefined encoding]';\n }\n }\n\n return 'Undefined';\n}\n\nexport function getCalculatedGpsValue(value) {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nconst LITTLE_ENDIAN = 0x4949;\nconst BIG_ENDIAN = 0x4d4d;\n\nexport default {\n BIG_ENDIAN,\n LITTLE_ENDIAN,\n getByteOrder\n};\n\nfunction getByteOrder(dataView, tiffHeaderOffset) {\n if (dataView.getUint16(tiffHeaderOffset) === LITTLE_ENDIAN) {\n return LITTLE_ENDIAN;\n } else if (dataView.getUint16(tiffHeaderOffset) === BIG_ENDIAN) {\n return BIG_ENDIAN;\n }\n throw new Error('Illegal byte order value. Faulty image.');\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Constants from './constants.js';\n\nexport default {\n isTiffFile,\n findTiffOffsets\n};\n\nfunction isTiffFile(dataView) {\n const MIN_TIFF_DATA_BUFFER_LENGTH = 4;\n\n return !!dataView && (dataView.byteLength >= MIN_TIFF_DATA_BUFFER_LENGTH) && hasTiffMarker(dataView);\n}\n\nfunction hasTiffMarker(dataView) {\n const TIFF_ID = 0x2a;\n const TIFF_ID_OFFSET = 2;\n\n const littleEndian = dataView.getUint16(0) === ByteOrder.LITTLE_ENDIAN;\n return dataView.getUint16(TIFF_ID_OFFSET, littleEndian) === TIFF_ID;\n}\n\nfunction findTiffOffsets() {\n const TIFF_FILE_HEADER_OFFSET = 0;\n\n if (Constants.USE_EXIF) {\n return {\n hasAppMarkers: true,\n tiffHeaderOffset: TIFF_FILE_HEADER_OFFSET\n };\n }\n return {};\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isJpegFile,\n findJpegOffsets\n};\n\nconst MIN_JPEG_DATA_BUFFER_LENGTH = 2;\nconst JPEG_ID = 0xffd8;\nconst JPEG_ID_SIZE = 2;\nconst APP_ID_OFFSET = 4;\nconst APP_MARKER_SIZE = 2;\nconst JFIF_DATA_OFFSET = 2; // From start of APP0 marker.\nconst TIFF_HEADER_OFFSET = 10; // From start of APP1 marker.\nconst IPTC_DATA_OFFSET = 18; // From start of APP13 marker.\nconst XMP_DATA_OFFSET = 33; // From start of APP1 marker.\nconst XMP_EXTENDED_DATA_OFFSET = 79; // From start of APP1 marker including GUID, total length, and offset.\nconst APP2_ICC_DATA_OFFSET = 18; // From start of APP2 marker including marker and chunk/chunk total numbers.\nconst MPF_DATA_OFFSET = 8;\n\nconst APP2_ICC_IDENTIFIER = 'ICC_PROFILE\\0';\nconst ICC_CHUNK_NUMBER_OFFSET = APP_ID_OFFSET + APP2_ICC_IDENTIFIER.length;\nconst ICC_TOTAL_CHUNKS_OFFSET = ICC_CHUNK_NUMBER_OFFSET + 1;\n\nconst APP2_MPF_IDENTIFIER = 'MPF\\0';\n\nconst SOF0_MARKER = 0xffc0;\nconst SOF2_MARKER = 0xffc2;\nconst DHT_MARKER = 0xffc4;\nconst DQT_MARKER = 0xffdb;\nconst DRI_MARKER = 0xffdd;\nconst SOS_MARKER = 0xffda;\n\nconst APP0_MARKER = 0xffe0;\nconst APP1_MARKER = 0xffe1;\nconst APP2_MARKER = 0xffe2;\nconst APP13_MARKER = 0xffed;\nconst APP15_MARKER = 0xffef;\nconst COMMENT_MARKER = 0xfffe;\n\n// Any number of fill bytes can be placed before an app marker. It's actually the first 0xff that is the\n// fill byte and the next 0xff is either another fill byte or the first half of the next app marker.\nconst FILL_BYTE = 0xffff;\n\nconst APP0_JFIF_IDENTIFIER = 'JFIF';\nconst APP1_EXIF_IDENTIFIER = 'Exif';\nconst APP1_XMP_IDENTIFIER = 'http://ns.adobe.com/xap/1.0/\\x00';\nconst APP1_XMP_EXTENDED_IDENTIFIER = 'http://ns.adobe.com/xmp/extension/\\x00';\nconst APP13_IPTC_IDENTIFIER = 'Photoshop 3.0';\n\nfunction isJpegFile(dataView) {\n return !!dataView && (dataView.byteLength >= MIN_JPEG_DATA_BUFFER_LENGTH) && (dataView.getUint16(0) === JPEG_ID);\n}\n\nfunction findJpegOffsets(dataView) {\n let appMarkerPosition = JPEG_ID_SIZE;\n let fieldLength;\n let sof0DataOffset;\n let sof2DataOffset;\n let jfifDataOffset;\n let tiffHeaderOffset;\n let iptcDataOffset;\n let xmpChunks;\n let iccChunks;\n let mpfDataOffset;\n\n while (appMarkerPosition + APP_ID_OFFSET + 5 <= dataView.byteLength) {\n if (Constants.USE_FILE && isSOF0Marker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n sof0DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_FILE && isSOF2Marker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n sof2DataOffset = appMarkerPosition + APP_MARKER_SIZE;\n } else if (Constants.USE_JFIF && isApp0JfifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n jfifDataOffset = appMarkerPosition + JFIF_DATA_OFFSET;\n } else if (Constants.USE_EXIF && isApp1ExifMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n tiffHeaderOffset = appMarkerPosition + TIFF_HEADER_OFFSET;\n } else if (Constants.USE_XMP && isApp1XmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_XMP && isApp1ExtendedXmpMarker(dataView, appMarkerPosition)) {\n if (!xmpChunks) {\n xmpChunks = [];\n }\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n xmpChunks.push(getExtendedXmpChunkDetails(appMarkerPosition, fieldLength));\n } else if (Constants.USE_IPTC && isApp13PhotoshopMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n iptcDataOffset = appMarkerPosition + IPTC_DATA_OFFSET;\n } else if (Constants.USE_ICC && isApp2ICCMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n const iccDataOffset = appMarkerPosition + APP2_ICC_DATA_OFFSET;\n const iccDataLength = fieldLength - (APP2_ICC_DATA_OFFSET - APP_MARKER_SIZE);\n\n const iccChunkNumber = dataView.getUint8(appMarkerPosition + ICC_CHUNK_NUMBER_OFFSET);\n const iccChunksTotal = dataView.getUint8(appMarkerPosition + ICC_TOTAL_CHUNKS_OFFSET);\n if (!iccChunks) {\n iccChunks = [];\n }\n iccChunks.push({offset: iccDataOffset, length: iccDataLength, chunkNumber: iccChunkNumber, chunksTotal: iccChunksTotal});\n } else if (Constants.USE_MPF && isApp2MPFMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n mpfDataOffset = appMarkerPosition + MPF_DATA_OFFSET;\n } else if (isAppMarker(dataView, appMarkerPosition)) {\n fieldLength = dataView.getUint16(appMarkerPosition + APP_MARKER_SIZE);\n } else if (isFillByte(dataView, appMarkerPosition)) {\n appMarkerPosition++;\n continue;\n } else {\n break;\n }\n appMarkerPosition += APP_MARKER_SIZE + fieldLength;\n }\n\n return {\n hasAppMarkers: appMarkerPosition > JPEG_ID_SIZE,\n fileDataOffset: sof0DataOffset || sof2DataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset\n };\n}\n\nfunction isSOF0Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF0_MARKER);\n}\n\nfunction isSOF2Marker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === SOF2_MARKER);\n}\n\nfunction isApp2ICCMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_ICC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_ICC_IDENTIFIER);\n}\n\nfunction isApp2MPFMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP2_MPF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP2_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP2_MPF_IDENTIFIER);\n}\n\nfunction isApp0JfifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP0_JFIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP0_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP0_JFIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1ExifMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP1_EXIF_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_EXIF_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isApp1XmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_IDENTIFIER;\n}\n\nfunction isApp1ExtendedXmpMarker(dataView, appMarkerPosition) {\n return (dataView.getUint16(appMarkerPosition) === APP1_MARKER)\n && isExtendedXmpIdentifier(dataView, appMarkerPosition);\n}\n\nfunction isExtendedXmpIdentifier(dataView, appMarkerPosition) {\n const markerIdLength = APP1_XMP_EXTENDED_IDENTIFIER.length;\n return getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP1_XMP_EXTENDED_IDENTIFIER;\n}\n\nfunction getXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_DATA_OFFSET,\n length: fieldLength - (XMP_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction getExtendedXmpChunkDetails(appMarkerPosition, fieldLength) {\n return {\n dataOffset: appMarkerPosition + XMP_EXTENDED_DATA_OFFSET,\n length: fieldLength - (XMP_EXTENDED_DATA_OFFSET - APP_MARKER_SIZE)\n };\n}\n\nfunction isApp13PhotoshopMarker(dataView, appMarkerPosition) {\n const markerIdLength = APP13_IPTC_IDENTIFIER.length;\n\n return (dataView.getUint16(appMarkerPosition) === APP13_MARKER)\n && (getStringFromDataView(dataView, appMarkerPosition + APP_ID_OFFSET, markerIdLength) === APP13_IPTC_IDENTIFIER)\n && (dataView.getUint8(appMarkerPosition + APP_ID_OFFSET + markerIdLength) === 0x00);\n}\n\nfunction isAppMarker(dataView, appMarkerPosition) {\n const appMarker = dataView.getUint16(appMarkerPosition);\n return ((appMarker >= APP0_MARKER) && (appMarker <= APP15_MARKER))\n || (appMarker === COMMENT_MARKER)\n || (appMarker === SOF0_MARKER)\n || (appMarker === SOF2_MARKER)\n || (appMarker === DHT_MARKER)\n || (appMarker === DQT_MARKER)\n || (appMarker === DRI_MARKER)\n || (appMarker === SOS_MARKER);\n}\n\nfunction isFillByte(dataView, appMarkerPosition) {\n return dataView.getUint16(appMarkerPosition) === FILL_BYTE;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringFromDataView, getNullTerminatedStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isPngFile,\n findPngOffsets\n};\n\nconst PNG_ID = '\\x89\\x50\\x4e\\x47\\x0d\\x0a\\x1a\\x0a';\nconst PNG_CHUNK_LENGTH_SIZE = 4;\nexport const PNG_CHUNK_TYPE_SIZE = 4;\nexport const PNG_CHUNK_LENGTH_OFFSET = 0;\nexport const PNG_CHUNK_TYPE_OFFSET = PNG_CHUNK_LENGTH_SIZE;\nexport const PNG_CHUNK_DATA_OFFSET = PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE;\nconst PNG_XMP_PREFIX = 'XML:com.adobe.xmp\\x00';\nexport const TYPE_TEXT = 'tEXt';\nexport const TYPE_ITXT = 'iTXt';\nexport const TYPE_ZTXT = 'zTXt';\nexport const TYPE_PHYS = 'pHYs';\nexport const TYPE_TIME = 'tIME';\nexport const TYPE_EXIF = 'eXIf';\nexport const TYPE_ICCP = 'iCCP';\n\nfunction isPngFile(dataView) {\n return !!dataView && getStringFromDataView(dataView, 0, PNG_ID.length) === PNG_ID;\n}\n\nfunction findPngOffsets(dataView, async) {\n const PNG_CRC_SIZE = 4;\n\n const offsets = {\n hasAppMarkers: false\n };\n\n let offset = PNG_ID.length;\n\n while (offset + PNG_CHUNK_LENGTH_SIZE + PNG_CHUNK_TYPE_SIZE <= dataView.byteLength) {\n if (Constants.USE_PNG_FILE && isPngImageHeaderChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.pngHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_XMP && isPngXmpChunk(dataView, offset)) {\n const dataOffset = getPngXmpDataOffset(dataView, offset);\n if (dataOffset !== undefined) {\n offsets.hasAppMarkers = true;\n offsets.xmpChunks = [{\n dataOffset,\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET) - (dataOffset - (offset + PNG_CHUNK_DATA_OFFSET))\n }];\n }\n } else if (isPngTextChunk(dataView, offset, async)) {\n offsets.hasAppMarkers = true;\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n if (!offsets.pngTextChunks) {\n offsets.pngTextChunks = [];\n }\n offsets.pngTextChunks.push({\n length: dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET),\n type: chunkType,\n offset: offset + PNG_CHUNK_DATA_OFFSET\n });\n } else if (isPngExifChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n offsets.tiffHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n } else if (Constants.USE_ICC && async && isPngIccpChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n const chunkDataLength = dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET);\n const iccHeaderOffset = offset + PNG_CHUNK_DATA_OFFSET;\n const {profileName, compressionMethod, compressedProfileOffset} = parseIccHeader(dataView, iccHeaderOffset);\n if (!offsets.iccChunks) {\n offsets.iccChunks = [];\n }\n offsets.iccChunks.push({\n offset: compressedProfileOffset,\n length: chunkDataLength - (compressedProfileOffset - iccHeaderOffset),\n chunkNumber: 1,\n chunksTotal: 1,\n profileName,\n compressionMethod\n });\n } else if (isPngChunk(dataView, offset)) {\n offsets.hasAppMarkers = true;\n if (!offsets.pngChunkOffsets) {\n offsets.pngChunkOffsets = [];\n }\n offsets.pngChunkOffsets.push(offset + PNG_CHUNK_LENGTH_OFFSET);\n }\n\n offset += dataView.getUint32(offset + PNG_CHUNK_LENGTH_OFFSET)\n + PNG_CHUNK_LENGTH_SIZE\n + PNG_CHUNK_TYPE_SIZE\n + PNG_CRC_SIZE;\n }\n\n return offsets;\n}\n\nfunction isPngImageHeaderChunk(dataView, offset) {\n const PNG_CHUNK_TYPE_IMAGE_HEADER = 'IHDR';\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === PNG_CHUNK_TYPE_IMAGE_HEADER;\n}\n\nfunction isPngXmpChunk(dataView, offset) {\n return (getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_ITXT)\n && (getStringFromDataView(dataView, offset + PNG_CHUNK_DATA_OFFSET, PNG_XMP_PREFIX.length) === PNG_XMP_PREFIX);\n}\n\nfunction isPngTextChunk(dataView, offset, async) {\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return chunkType === TYPE_TEXT || chunkType === TYPE_ITXT || (chunkType === TYPE_ZTXT && async);\n}\n\nfunction isPngExifChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_EXIF;\n}\n\nfunction isPngIccpChunk(dataView, offset) {\n return getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE) === TYPE_ICCP;\n}\n\nfunction isPngChunk(dataView, offset) {\n const SUPPORTED_PNG_CHUNK_TYPES = [TYPE_PHYS, TYPE_TIME];\n const chunkType = getStringFromDataView(dataView, offset + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n return SUPPORTED_PNG_CHUNK_TYPES.includes(chunkType);\n}\n\nfunction getPngXmpDataOffset(dataView, offset) {\n const COMPRESSION_FLAG_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n offset += PNG_CHUNK_DATA_OFFSET + PNG_XMP_PREFIX.length + COMPRESSION_FLAG_SIZE + COMPRESSION_METHOD_SIZE;\n\n let numberOfNullSeparators = 0;\n while (numberOfNullSeparators < 2 && offset < dataView.byteLength) {\n if (dataView.getUint8(offset) === 0x00) {\n numberOfNullSeparators++;\n }\n offset++;\n }\n if (numberOfNullSeparators < 2) {\n return undefined;\n }\n return offset;\n}\n\nfunction parseIccHeader(dataView, offset) {\n const NULL_SEPARATOR_SIZE = 1;\n const COMPRESSION_METHOD_SIZE = 1;\n\n const profileName = getNullTerminatedStringFromDataView(dataView, offset);\n offset += profileName.length + NULL_SEPARATOR_SIZE;\n\n const compressionMethod = dataView.getUint8(offset);\n offset += COMPRESSION_METHOD_SIZE;\n\n return {\n profileName,\n compressionMethod,\n compressedProfileOffset: offset\n };\n}\n","export function get64BitValue(dataView, offset) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return dataView.getUint32(offset + 4);\n}\n","import {get64BitValue} from './image-header-iso-bmff-utils.js';\n\nexport function parseItemLocationBox(dataView, version, contentOffset, boxLength) {\n const FLAGS_SIZE = 3;\n\n const {offsets, sizes} = getItemLocationBoxOffsetsAndSizes(version, contentOffset + FLAGS_SIZE);\n\n const offsetSize = dataView.getUint8(offsets.offsetSize) >> 4;\n sizes.item.extent.extentOffset = offsetSize;\n const lengthSize = dataView.getUint8(offsets.lengthSize) & 0x0f;\n sizes.item.extent.extentLength = lengthSize;\n const baseOffsetSize = dataView.getUint8(offsets.baseOffsetSize) >> 4;\n sizes.item.baseOffset = baseOffsetSize;\n const indexSize = getIndexSize(dataView, offsets.indexSize, version);\n sizes.item.extent.extentIndex = indexSize !== undefined ? indexSize : 0;\n const itemCount = getItemCount(dataView, offsets.itemCount, version);\n\n return {\n type: 'iloc',\n items: getItems(dataView, version, offsets, sizes, offsetSize, lengthSize, indexSize, itemCount),\n length: boxLength\n };\n}\n\nfunction getItemLocationBoxOffsetsAndSizes(version, contentOffset) {\n const sizes = {\n item: {\n dataReferenceIndex: 2,\n extentCount: 2,\n extent: {}\n }\n };\n if (version < 2) {\n sizes.itemCount = 2;\n sizes.item.itemId = 2;\n } else if (version === 2) {\n sizes.itemCount = 4;\n sizes.item.itemId = 4;\n }\n if (version === 1 || version === 2) {\n sizes.item.constructionMethod = 2;\n } else {\n sizes.item.constructionMethod = 0;\n }\n\n const offsets = {\n offsetSize: contentOffset,\n lengthSize: contentOffset,\n baseOffsetSize: contentOffset + 1,\n indexSize: contentOffset + 1\n };\n offsets.itemCount = contentOffset + 2;\n offsets.items = offsets.itemCount + sizes.itemCount;\n offsets.item = {\n itemId: 0\n };\n offsets.item.constructionMethod = offsets.item.itemId + sizes.item.itemId;\n offsets.item.dataReferenceIndex = offsets.item.constructionMethod + sizes.item.constructionMethod;\n\n return {offsets, sizes};\n}\n\nfunction getIndexSize(dataView, offset, version) {\n if (version === 1 || version === 2) {\n return dataView.getUint8(offset) & 0x0f;\n }\n return undefined;\n}\n\nfunction getItemCount(dataView, offset, version) {\n if (version < 2) {\n return dataView.getUint16(offset);\n } else if (version === 2) {\n return dataView.getUint32(offset);\n }\n return undefined;\n}\n\nfunction getItems(dataView, version, offsets, sizes, offsetSize, lengthSize, indexSize, itemCount) {\n if (itemCount === undefined) {\n return [];\n }\n\n const items = [];\n let offset = offsets.items;\n\n for (let i = 0; i < itemCount; i++) {\n const item = {extents: []};\n item.itemId = getItemId(dataView, offset, version);\n offset += sizes.item.itemId;\n item.constructionMethod = (version === 1) || (version === 2) ? dataView.getUint16(offset) & 0x0f : undefined;\n offset += sizes.item.constructionMethod;\n item.dataReferenceIndex = dataView.getUint16(offset);\n offset += sizes.item.dataReferenceIndex;\n item.baseOffset = getVariableSizedValue(dataView, offset, sizes.item.baseOffset);\n offset += sizes.item.baseOffset;\n item.extentCount = dataView.getUint16(offset);\n offset += sizes.item.extentCount;\n for (let j = 0; j < item.extentCount; j++) {\n const extent = {};\n\n extent.extentIndex = getExtentIndex(dataView, version, offset, indexSize);\n offset += sizes.item.extent.extentIndex;\n extent.extentOffset = getVariableSizedValue(dataView, offset, offsetSize);\n offset += sizes.item.extent.extentOffset;\n extent.extentLength = getVariableSizedValue(dataView, offset, lengthSize);\n offset += sizes.item.extent.extentLength;\n\n item.extents.push(extent);\n }\n\n items.push(item);\n }\n\n return items;\n}\n\nfunction getItemId(dataView, offset, version) {\n if (version < 2) {\n return dataView.getUint16(offset);\n } else if (version === 2) {\n return dataView.getUint32(offset);\n }\n return undefined;\n}\n\nfunction getExtentIndex(dataView, version, offset, indexSize) {\n if ((version === 1 || version === 2) && indexSize > 0) {\n return getVariableSizedValue(dataView, offset, indexSize);\n }\n return undefined;\n}\n\nfunction getVariableSizedValue(dataView, offset, size) {\n if (size === 4) {\n return dataView.getUint32(offset);\n }\n if (size === 8) {\n // eslint-disable-next-line no-console\n console.warn('This file uses an 8-bit offset which is currently not supported by ExifReader. Contact the maintainer to get it fixed.');\n return get64BitValue(dataView, offset);\n }\n return 0;\n}\n","import Constants from './constants.js';\nimport {getNullTerminatedStringFromDataView, getStringFromDataView} from './utils.js';\n// import {get64BitValue} from './image-header-iso-bmff-utils.js';\nimport {parseItemLocationBox} from './image-header-iso-bmff-iloc.js';\n\n// HEIC and AVIF files are based on the ISO-BMFF format. This file format is\n// built up by boxes. There are boxes and full boxes. All box types have a\n// length (4 or 8 bytes) and a type (4 bytes). Full boxes also have a version\n// (1 byte) and flags (3 bytes). The boxes can be nested. Each box type has its\n// own structure that can be seen in the specification.\n//\n// For metadata we are interested in the meta box. The meta box contains sub\n// boxes. The sub box type iinf has info about which types of metadata are\n// present in the file. The item ID we get from there we then look up in the\n// iloc sub box to get the offset to the real location of the metadata.\n//\n// The ICC profiles is a bit more nested. We have to look in\n// meta > iprp > ipco > colr, and then the whole profile is stored there.\n\n// These are actually 32-bit strings, not random IDs, e.g. \"ftyp\" and \"meta\".\nconst TYPE_FTYP = 0x66747970;\nconst TYPE_IPRP = 0x69707270;\nconst TYPE_META = 0x6d657461;\nconst TYPE_ILOC = 0x696c6f63;\nconst TYPE_IINF = 0x69696e66;\nconst TYPE_INFE = 0x696e6665;\nconst TYPE_IPCO = 0x6970636f;\nconst TYPE_COLR = 0x636f6c72;\n\n// const EXTENSION_TYPE_FDEL = 0x6664656c;\n\nexport const ITEM_INFO_TYPE_EXIF = 0x45786966;\nexport const ITEM_INFO_TYPE_MIME = 0x6d696d65;\nconst ITEM_INFO_TYPE_URI = 0x75726920;\n\n/**\n * Parses a ISO-BMFF box from the provided data view starting at the given offset.\n *\n * @param {DataView} dataView - The DataView to parse.\n * @param {number} offset - The offset at which to start parsing.\n * @returns {Object} The parsed box.\n */\nexport function parseBox(dataView, offset) {\n const BOX_TYPE_OFFSET = 4;\n const BOX_MIN_LENGTH = 8;\n const VERSION_SIZE = 1;\n\n const {length, contentOffset} = getBoxLength(dataView, offset);\n if (length < BOX_MIN_LENGTH) {\n return undefined;\n }\n\n const type = dataView.getUint32(offset + BOX_TYPE_OFFSET);\n\n if (type === TYPE_FTYP) {\n return parseFileTypeBox(dataView, contentOffset, length);\n }\n if (type === TYPE_IPRP) {\n return parseItemPropertiesBox(dataView, offset, contentOffset, length);\n }\n if (type === TYPE_IPCO) {\n return parseItemPropertyContainerBox(dataView, offset, contentOffset, length);\n }\n if (type === TYPE_COLR) {\n return parseColorInformationBox(dataView, contentOffset, length);\n }\n\n // The following are full boxes, also containing version and flags.\n const version = dataView.getUint8(contentOffset);\n\n if (type === TYPE_META) {\n return parseMetadataBox(dataView, offset, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_ILOC) {\n return parseItemLocationBox(dataView, version, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_IINF) {\n return parseItemInformationBox(dataView, offset, version, contentOffset + VERSION_SIZE, length);\n }\n if (type === TYPE_INFE) {\n return parseItemInformationEntryBox(dataView, offset, version, contentOffset + VERSION_SIZE, length);\n }\n\n return {\n // type: getStringFromDataView(dataView, offset + BOX_TYPE_OFFSET, 4),\n type: undefined,\n length\n };\n}\n\n/**\n * @typedef {Object} BoxLength\n * @property {number} length The length of the box including length and type.\n * @property {number} contentOffset\n */\n\n/**\n * @param {DataView} dataView\n * @param {number} offset\n * @returns {BoxLength}\n */\nfunction getBoxLength(dataView, offset) {\n const BOX_LENGTH_SIZE = 4;\n const BOX_TYPE_SIZE = 4;\n const BOX_EXTENDED_SIZE = 8;\n const BOX_EXTENDED_SIZE_LOW_OFFSET = 12;\n\n const boxLength = dataView.getUint32(offset);\n if (extendsToEndOfFile(boxLength)) {\n return {\n length: dataView.byteLength - offset,\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE,\n };\n }\n if (hasExtendedSize(boxLength)) {\n if (hasEmptyHighBits(dataView, offset)) {\n // It's a bit tricky to handle 64 bit numbers in JavaScript. Let's\n // wait until there are real-world examples where it is necessary.\n return {\n length: dataView.getUint32(offset + BOX_EXTENDED_SIZE_LOW_OFFSET),\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE + BOX_EXTENDED_SIZE,\n };\n }\n }\n\n return {\n length: boxLength,\n contentOffset: offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE,\n };\n}\n\nfunction extendsToEndOfFile(boxLength) {\n return boxLength === 0;\n}\n\nfunction hasExtendedSize(boxLength) {\n return boxLength === 1;\n}\n\nfunction hasEmptyHighBits(dataView, offset) {\n const BOX_EXTENDED_SIZE_OFFSET = 8;\n return dataView.getUint32(offset + BOX_EXTENDED_SIZE_OFFSET) === 0;\n}\n\n/**\n * @typedef {Object} Offsets\n * @property {number} tiffHeaderOffset\n * @property {Array} xmpChunks\n * @property {Array} iccChunks\n * @property {boolean} hasAppMarkers\n */\n\n/**\n * Finds the offsets of ISO-BMFF-structued data in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Offsets} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nexport function findOffsets(dataView) {\n if (Constants.USE_EXIF || Constants.USE_XMP || Constants.USE_ICC) {\n const offsets = {};\n const metaBox = findMetaBox(dataView);\n\n if (!metaBox) {\n return {hasAppMarkers: false};\n }\n\n if (Constants.USE_EXIF) {\n offsets.tiffHeaderOffset = findExifOffset(dataView, metaBox);\n }\n if (Constants.USE_XMP) {\n offsets.xmpChunks = findXmpChunks(metaBox);\n }\n if (Constants.USE_ICC) {\n offsets.iccChunks = findIccChunks(metaBox);\n }\n offsets.hasAppMarkers = (offsets.tiffHeaderOffset !== undefined) || (offsets.xmpChunks !== undefined) || (offsets.iccChunks !== undefined);\n return offsets;\n }\n\n return {};\n}\n\nfunction findMetaBox(dataView) {\n const BOX_LENGTH_SIZE = 4;\n const BOX_TYPE_SIZE = 4;\n\n let offset = 0;\n\n while (offset + BOX_LENGTH_SIZE + BOX_TYPE_SIZE <= dataView.byteLength) {\n const box = parseBox(dataView, offset);\n\n if (box === undefined) {\n break;\n }\n\n if (box.type === 'meta') {\n return box;\n }\n\n offset += box.length;\n }\n\n return undefined;\n}\n\nfunction findExifOffset(dataView, metaBox) {\n try {\n const exifItemId = findIinfExifItemId(metaBox).itemId;\n const ilocItem = findIlocItem(metaBox, exifItemId);\n const exifOffset = ilocItem.baseOffset + ilocItem.extents[0].extentOffset;\n return getTiffHeaderOffset(dataView, exifOffset);\n } catch (error) {\n return undefined;\n }\n}\n\nfunction findIinfExifItemId(metaBox) {\n return metaBox.subBoxes.find((box) => box.type === 'iinf').itemInfos.find((itemInfo) => itemInfo.itemType === ITEM_INFO_TYPE_EXIF);\n}\n\nfunction findIlocItem(metaBox, itemId) {\n return metaBox.subBoxes.find((box) => box.type === 'iloc').items.find((item) => item.itemId === itemId);\n}\n\nfunction getTiffHeaderOffset(dataView, exifOffset) {\n // ISO-BMFF formatted files store the Exif data as an \"Exif block\" where the\n // first 32 bits is the TIFF header offset.\n const TIFF_HEADER_OFFSET_SIZE = 4;\n return exifOffset + TIFF_HEADER_OFFSET_SIZE + dataView.getUint32(exifOffset);\n}\n\nfunction findXmpChunks(metaBox) {\n try {\n const xmpItemId = findIinfXmpItemId(metaBox).itemId;\n const ilocItem = findIlocItem(metaBox, xmpItemId);\n const ilocItemExtent = findIlocItem(metaBox, xmpItemId).extents[0];\n return [\n {\n dataOffset: ilocItem.baseOffset + ilocItemExtent.extentOffset,\n length: ilocItemExtent.extentLength,\n }\n ];\n } catch (error) {\n return undefined;\n }\n}\n\nfunction findIinfXmpItemId(metaBox) {\n return metaBox.subBoxes.find((box) => box.type === 'iinf')\n .itemInfos.find((itemInfo) => itemInfo.itemType === ITEM_INFO_TYPE_MIME && itemInfo.contentType === 'application/rdf+xml');\n}\n\nfunction findIccChunks(metaBox) {\n // This finds the first ICC chunk, but there could be one for each image\n // that is embedded in the file. If it turns out we need to match the ICC\n // chunk to a specific image, we need to check the \"ipma\" in addition to the\n // \"ipco\" (currently we only extract the \"ipco\" so more code would be\n // needed).\n try {\n const icc = metaBox.subBoxes.find((box) => box.type === 'iprp')\n .subBoxes.find((box) => box.type === 'ipco')\n .properties.find((box) => box.type === 'colr')\n .icc;\n if (icc) {\n return [icc];\n }\n } catch (error) {\n // Let it pass through.\n }\n return undefined;\n}\n\nfunction parseFileTypeBox(dataView, contentOffset, boxLength) {\n const MAJOR_BRAND_SIZE = 4;\n const majorBrand = getStringFromDataView(dataView, contentOffset, MAJOR_BRAND_SIZE);\n\n return {\n type: 'ftyp',\n majorBrand,\n length: boxLength\n };\n}\n\nfunction parseItemPropertiesBox(dataView, startOffset, contentOffset, length) {\n return {\n type: 'iprp',\n subBoxes: parseSubBoxes(dataView, contentOffset, length - (contentOffset - startOffset)),\n length,\n };\n}\n\nfunction parseItemPropertyContainerBox(dataView, startOffset, contentOffset, length) {\n return {\n type: 'ipco',\n properties: parseSubBoxes(dataView, contentOffset, length - (contentOffset - startOffset)),\n length,\n };\n}\n\nfunction parseColorInformationBox(dataView, contentOffset, length) {\n return {\n type: 'colr',\n icc: parseIcc(dataView, contentOffset),\n length,\n };\n}\n\nfunction parseIcc(dataView, contentOffset) {\n const COLOR_TYPE_SIZE = 4;\n\n const colorType = getStringFromDataView(dataView, contentOffset, COLOR_TYPE_SIZE);\n if (colorType !== 'prof' && colorType !== 'rICC') {\n // Support for nclx would require some restructuring for ICC handling.\n // Probably do it as a separate feature instead of combining with ICC.\n // Exiftool groups it under QuickTime. The test file test.avif has nclx.\n return undefined;\n }\n\n return {\n offset: contentOffset + COLOR_TYPE_SIZE,\n length: dataView.getUint32(contentOffset + COLOR_TYPE_SIZE),\n chunkNumber: 1,\n chunksTotal: 1\n };\n}\n\nfunction parseMetadataBox(dataView, startOffset, contentOffset, length) {\n const FLAGS_SIZE = 3;\n\n return {\n type: 'meta',\n subBoxes: parseSubBoxes(dataView, contentOffset + FLAGS_SIZE, length - (contentOffset + FLAGS_SIZE - startOffset)),\n length\n };\n}\n\n/**\n * @param {DataView} dataView\n * @param {number} offset The offset to start parsing from.\n * @param {number} length The length of all sub boxes combined.\n * @return {Array}\n */\nfunction parseSubBoxes(dataView, offset, length) {\n const ACCEPTED_ITEM_INFO_TYPES = [\n ITEM_INFO_TYPE_EXIF,\n ITEM_INFO_TYPE_MIME,\n ];\n\n const subBoxes = [];\n let currentOffset = offset;\n while (currentOffset < offset + length) {\n const box = parseBox(dataView, currentOffset);\n if (box === undefined) {\n break;\n }\n if (box.type !== undefined && (box.itemType === undefined || ACCEPTED_ITEM_INFO_TYPES.indexOf(box.itemType) !== -1)) {\n subBoxes.push(box);\n }\n currentOffset += box.length;\n }\n return subBoxes;\n}\n\nfunction parseItemInformationBox(dataView, startOffset, version, contentOffset, length) {\n const {offsets} = getItemInformationBoxOffsetsAndSizes(version, contentOffset);\n\n return {\n type: 'iinf',\n itemInfos: parseSubBoxes(dataView, offsets.itemInfos, length - (offsets.itemInfos - startOffset)),\n length\n };\n}\n\nfunction getItemInformationBoxOffsetsAndSizes(version, contentOffset) {\n const FLAGS_SIZE = 3;\n\n const offsets = {entryCount: contentOffset + FLAGS_SIZE};\n const sizes = {};\n\n if (version === 0) {\n sizes.entryCount = 2;\n } else {\n sizes.entryCount = 4;\n }\n\n offsets.itemInfos = offsets.entryCount + sizes.entryCount;\n\n return {offsets};\n}\n\nfunction parseItemInformationEntryBox(dataView, startOffset, version, contentOffset, length) {\n const FLAGS_SIZE = 3;\n\n contentOffset += FLAGS_SIZE;\n const entry = {type: 'infe', length};\n\n if (version === 0 || version === 1) {\n entry.itemId = dataView.getUint16(contentOffset);\n contentOffset += 2;\n entry.itemProtectionIndex = dataView.getUint16(contentOffset);\n contentOffset += 2;\n entry.itemName = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemName.length + 1;\n // entry.contentType = getNullTerminatedStringFromDataView(dataView, offset);\n // offset += entry.contentType.length + 1;\n // Since contentEncoding is optional we need to check the offset against length here.\n // entry.contentEncoding = getNullTerminatedStringFromDataView(dataView, offset);\n // offset += entry.contentEncoding.length + 1;\n }\n // The following code should be correct but we currently don't need it.\n // if (version === 1) {\n // // Everything here is optional, check the offset against length.\n // entry.extensionType = dataView.getUint32(contentOffset);\n // contentOffset += 4;\n // if (entry.extensionType === EXTENSION_TYPE_FDEL) {\n // entry.contentLocation = getNullTerminatedStringFromDataView(dataView, contentOffset);\n // contentOffset += entry.contentLocation.length + 1;\n // entry.contentMd5 = getNullTerminatedStringFromDataView(dataView, contentOffset);\n // contentOffset += entry.contentMd5.length + 1;\n // entry.contentLength = get64BitValue(dataView, contentOffset);\n // contentOffset += 8;\n // entry.transferLength = get64BitValue(dataView, contentOffset);\n // contentOffset += 8;\n // entry.entryCount = dataView.getUint8(contentOffset);\n // contentOffset += 1;\n // entry.entries = [];\n // for (let i = 0; i < entry.entryCount; i++) {\n // entry.entries.push({groupId: dataView.getUint32(contentOffset)});\n // contentOffset += 4;\n // }\n // }\n // }\n if (version >= 2) {\n if (version === 2) {\n entry.itemId = dataView.getUint16(contentOffset);\n contentOffset += 2;\n } else if (version === 3) {\n entry.itemId = dataView.getUint32(contentOffset);\n contentOffset += 4;\n }\n entry.itemProtectionIndex = dataView.getUint16(contentOffset);\n contentOffset += 2;\n // entry.itemTypeAscii = getStringFromDataView(dataView, offset, 4); // For testing.\n entry.itemType = dataView.getUint32(contentOffset);\n contentOffset += 4;\n entry.itemName = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemName.length + 1;\n if (entry.itemType === ITEM_INFO_TYPE_MIME) {\n entry.contentType = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.contentType.length + 1;\n if (startOffset + length > contentOffset) {\n entry.contentEncoding = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.contentEncoding.length + 1;\n }\n } else if (entry.itemType === ITEM_INFO_TYPE_URI) {\n entry.itemUri = getNullTerminatedStringFromDataView(dataView, contentOffset);\n contentOffset += entry.itemUri.length + 1;\n }\n }\n return entry;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {parseBox, findOffsets} from './image-header-iso-bmff.js';\n\nexport default {\n isHeicFile,\n findHeicOffsets\n};\n\n/**\n * Checks if the provided data view represents a HEIC/HEIF file.\n *\n * @param {DataView} dataView - The data view to check.\n * @returns {boolean} True if the data view represents a HEIC/HEIF file, false otherwise.\n */\nfunction isHeicFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n const HEIC_MAJOR_BRANDS = ['heic', 'heix', 'hevc', 'hevx', 'heim', 'heis', 'hevm', 'hevs', 'mif1'];\n\n try {\n const headerBox = parseBox(dataView, 0);\n return headerBox && HEIC_MAJOR_BRANDS.indexOf(headerBox.majorBrand) !== -1;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds the offsets of a HEIC file in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Object} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nfunction findHeicOffsets(dataView) {\n return findOffsets(dataView);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification:\n// https://aomediacodec.github.io/av1-avif\n\nimport {parseBox, findOffsets} from './image-header-iso-bmff.js';\n\nexport default {\n isAvifFile,\n findAvifOffsets\n};\n\n/**\n * Checks if the provided data view represents an AVIF file.\n *\n * @param {DataView} dataView - The data view to check.\n * @returns {boolean} True if the data view represents an AVIF file, false otherwise.\n */\nfunction isAvifFile(dataView) {\n if (!dataView) {\n return false;\n }\n\n try {\n const headerBox = parseBox(dataView, 0);\n return headerBox && headerBox.majorBrand === 'avif';\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Finds the offsets of an AVIF file in the provided data view.\n *\n * @param {DataView} dataView - The data view to find offsets in.\n * @returns {Object} An object containing the offsets of the TIFF header, XMP chunks, ICC chunks, and a boolean indicating if any of these exist.\n */\nfunction findAvifOffsets(dataView) {\n return findOffsets(dataView);\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\nimport Constants from './constants.js';\n\nexport default {\n isWebpFile,\n findOffsets\n};\n\nfunction isWebpFile(dataView) {\n const RIFF_ID_OFFSET = 0;\n const RIFF_ID = 'RIFF';\n const WEBP_MARKER_OFFSET = 8;\n const WEBP_MARKER = 'WEBP';\n\n return !!dataView && getStringFromDataView(dataView, RIFF_ID_OFFSET, RIFF_ID.length) === RIFF_ID\n && getStringFromDataView(dataView, WEBP_MARKER_OFFSET, WEBP_MARKER.length) === WEBP_MARKER;\n}\n\nfunction findOffsets(dataView) {\n const SUB_CHUNK_START_OFFSET = 12;\n const CHUNK_SIZE_OFFSET = 4;\n const EXIF_IDENTIFIER = 'Exif\\x00\\x00';\n const CHUNK_HEADER_SIZE = 8;\n\n let offset = SUB_CHUNK_START_OFFSET;\n let hasAppMarkers = false;\n let tiffHeaderOffset;\n let xmpChunks;\n let iccChunks;\n let vp8xChunkOffset;\n\n while (offset + CHUNK_HEADER_SIZE < dataView.byteLength) {\n const chunkId = getStringFromDataView(dataView, offset, 4);\n const chunkSize = dataView.getUint32(offset + CHUNK_SIZE_OFFSET, true);\n\n if (Constants.USE_EXIF && (chunkId === 'EXIF')) {\n hasAppMarkers = true;\n if (getStringFromDataView(dataView, offset + CHUNK_HEADER_SIZE, EXIF_IDENTIFIER.length) === EXIF_IDENTIFIER) {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE + EXIF_IDENTIFIER.length;\n } else {\n tiffHeaderOffset = offset + CHUNK_HEADER_SIZE;\n }\n } else if (Constants.USE_XMP && (chunkId === 'XMP ')) {\n hasAppMarkers = true;\n xmpChunks = [{\n dataOffset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize\n }];\n } else if (Constants.USE_ICC && (chunkId === 'ICCP')) {\n hasAppMarkers = true;\n iccChunks = [{\n offset: offset + CHUNK_HEADER_SIZE,\n length: chunkSize,\n chunkNumber: 1,\n chunksTotal: 1\n }];\n } else if (chunkId === 'VP8X') {\n hasAppMarkers = true;\n vp8xChunkOffset = offset + CHUNK_HEADER_SIZE;\n }\n\n offset += CHUNK_HEADER_SIZE + (chunkSize % 2 === 0 ? chunkSize : chunkSize + 1);\n }\n\n return {\n hasAppMarkers,\n tiffHeaderOffset,\n xmpChunks,\n iccChunks,\n vp8xChunkOffset\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n isGifFile,\n findOffsets\n};\n\nconst GIF_SIGNATURE_SIZE = 6;\nconst GIF_SIGNATURES = ['GIF87a', 'GIF89a'];\n\nfunction isGifFile(dataView) {\n return !!dataView && GIF_SIGNATURES.includes(getStringFromDataView(dataView, 0, GIF_SIGNATURE_SIZE));\n}\n\nfunction findOffsets() {\n return {\n gifHeaderOffset: 0\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n isXMLFile,\n findOffsets\n};\n\nconst XML_MARKER_OFFSET = 0;\nconst XML_MARKER = ' Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2),\n ColorSpace(value) {\n if (value === 1) {\n return 'sRGB';\n } else if (value === 0xffff) {\n return 'Uncalibrated';\n }\n return 'Unknown';\n },\n ComponentsConfiguration(value) {\n return value.map((character) => {\n if (character === 0x31) {\n return 'Y';\n } else if (character === 0x32) {\n return 'Cb';\n } else if (character === 0x33) {\n return 'Cr';\n } else if (character === 0x34) {\n return 'R';\n } else if (character === 0x35) {\n return 'G';\n } else if (character === 0x36) {\n return 'B';\n }\n }).join('');\n },\n Contrast(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n CustomRendered(value) {\n if (value === 0) {\n return 'Normal process';\n } else if (value === 1) {\n return 'Custom process';\n }\n return 'Unknown';\n },\n ExposureMode(value) {\n if (value === 0) {\n return 'Auto exposure';\n } else if (value === 1) {\n return 'Manual exposure';\n } else if (value === 2) {\n return 'Auto bracket';\n }\n return 'Unknown';\n },\n ExposureProgram(value) {\n if (value === 0) {\n return 'Undefined';\n } else if (value === 1) {\n return 'Manual';\n } else if (value === 2) {\n return 'Normal program';\n } else if (value === 3) {\n return 'Aperture priority';\n } else if (value === 4) {\n return 'Shutter priority';\n } else if (value === 5) {\n return 'Creative program';\n } else if (value === 6) {\n return 'Action program';\n } else if (value === 7) {\n return 'Portrait mode';\n } else if (value === 8) {\n return 'Landscape mode';\n } else if (value === 9) {\n return 'Bulb';\n }\n return 'Unknown';\n },\n ExposureTime(value) {\n if (value[0] / value[1] > 0.25) {\n const decimal = value[0] / value[1];\n if (Number.isInteger(decimal)) {\n return '' + decimal;\n }\n return decimal.toFixed(1);\n }\n if (value[0] !== 0) {\n return `1/${Math.round(value[1] / value[0])}`;\n }\n return `0/${value[1]}`;\n },\n FNumber: (value) => `f/${value[0] / value[1]}`,\n FocalLength: (value) => (value[0] / value[1]) + ' mm',\n FocalPlaneResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n } else if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n LightSource: (value) => {\n if (value === 1) {\n return 'Daylight';\n } else if (value === 2) {\n return 'Fluorescent';\n } else if (value === 3) {\n return 'Tungsten (incandescent light)';\n } else if (value === 4) {\n return 'Flash';\n } else if (value === 9) {\n return 'Fine weather';\n } else if (value === 10) {\n return 'Cloudy weather';\n } else if (value === 11) {\n return 'Shade';\n } else if (value === 12) {\n return 'Daylight fluorescent (D 5700 – 7100K)';\n } else if (value === 13) {\n return 'Day white fluorescent (N 4600 – 5400K)';\n } else if (value === 14) {\n return 'Cool white fluorescent (W 3900 – 4500K)';\n } else if (value === 15) {\n return 'White fluorescent (WW 3200 – 3700K)';\n } else if (value === 17) {\n return 'Standard light A';\n } else if (value === 18) {\n return 'Standard light B';\n } else if (value === 19) {\n return 'Standard light C';\n } else if (value === 20) {\n return 'D55';\n } else if (value === 21) {\n return 'D65';\n } else if (value === 22) {\n return 'D75';\n } else if (value === 23) {\n return 'D50';\n } else if (value === 24) {\n return 'ISO studio tungsten';\n } else if (value === 255) {\n return 'Other light source';\n }\n return 'Unknown';\n },\n MeteringMode(value) {\n if (value === 1) {\n return 'Average';\n } else if (value === 2) {\n return 'CenterWeightedAverage';\n } else if (value === 3) {\n return 'Spot';\n } else if (value === 4) {\n return 'MultiSpot';\n } else if (value === 5) {\n return 'Pattern';\n } else if (value === 6) {\n return 'Partial';\n } else if (value === 255) {\n return 'Other';\n }\n return 'Unknown';\n },\n ResolutionUnit(value) {\n if (value === 2) {\n return 'inches';\n }\n if (value === 3) {\n return 'centimeters';\n }\n return 'Unknown';\n },\n Saturation(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Low saturation';\n } else if (value === 2) {\n return 'High saturation';\n }\n return 'Unknown';\n },\n SceneCaptureType(value) {\n if (value === 0) {\n return 'Standard';\n } else if (value === 1) {\n return 'Landscape';\n } else if (value === 2) {\n return 'Portrait';\n } else if (value === 3) {\n return 'Night scene';\n }\n return 'Unknown';\n },\n Sharpness(value) {\n if (value === 0) {\n return 'Normal';\n } else if (value === 1) {\n return 'Soft';\n } else if (value === 2) {\n return 'Hard';\n }\n return 'Unknown';\n },\n ShutterSpeedValue(value) {\n const denominator = Math.pow(2, value[0] / value[1]);\n if (denominator <= 1) {\n return `${Math.round(1 / denominator)}`;\n }\n return `1/${Math.round(denominator)}`;\n },\n WhiteBalance(value) {\n if (value === 0) {\n return 'Auto white balance';\n } else if (value === 1) {\n return 'Manual white balance';\n }\n return 'Unknown';\n },\n XResolution: (value) => '' + Math.round(value[0] / value[1]),\n YResolution: (value) => '' + Math.round(value[0] / value[1])\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x000b: 'ProcessingSoftware',\n 0x00fe: {\n name: 'SubfileType',\n description: (value) => ({\n 0x0: 'Full-resolution image',\n 0x1: 'Reduced-resolution image',\n 0x2: 'Single page of multi-page image',\n 0x3: 'Single page of multi-page reduced-resolution image',\n 0x4: 'Transparency mask',\n 0x5: 'Transparency mask of reduced-resolution image',\n 0x6: 'Transparency mask of multi-page image',\n 0x7: 'Transparency mask of reduced-resolution multi-page image',\n 0x10001: 'Alternate reduced-resolution image',\n 0xffffffff: 'Invalid'\n })[value] || 'Unknown'\n },\n 0x00ff: {\n name: 'OldSubfileType',\n description: (value) => ({\n 0: 'Full-resolution image',\n 1: 'Reduced-resolution image',\n 2: 'Single page of multi-page image'\n })[value] || 'Unknown'\n },\n 0x0100: 'ImageWidth',\n 0x0101: 'ImageLength',\n 0x0102: 'BitsPerSample',\n 0x0103: 'Compression',\n 0x0106: 'PhotometricInterpretation',\n 0x0107: {\n name: 'Thresholding',\n description: (value) => ({\n 1: 'No dithering or halftoning',\n 2: 'Ordered dither or halfton',\n 3: 'Randomized dither'\n })[value] || 'Unknown'\n },\n 0x0108: 'CellWidth',\n 0x0109: 'CellLength',\n 0x010a: {\n name: 'FillOrder',\n description: (value) => ({\n 1: 'Normal',\n 2: 'Reversed'\n })[value] || 'Unknown'\n },\n 0x010d: 'DocumentName',\n 0x010e: 'ImageDescription',\n 0x010f: 'Make',\n 0x0110: 'Model',\n 0x0111: 'StripOffsets',\n 0x0112: {\n name: 'Orientation',\n description: (value) => {\n if (value === 1) {\n return 'top-left';\n }\n if (value === 2) {\n return 'top-right';\n }\n if (value === 3) {\n return 'bottom-right';\n }\n if (value === 4) {\n return 'bottom-left';\n }\n if (value === 5) {\n return 'left-top';\n }\n if (value === 6) {\n return 'right-top';\n }\n if (value === 7) {\n return 'right-bottom';\n }\n if (value === 8) {\n return 'left-bottom';\n }\n return 'Undefined';\n }\n },\n 0x0115: 'SamplesPerPixel',\n 0x0116: 'RowsPerStrip',\n 0x0117: 'StripByteCounts',\n 0x0118: 'MinSampleValue',\n 0x0119: 'MaxSampleValue',\n 0x011a: {\n 'name': 'XResolution',\n 'description': TagNamesCommon.XResolution\n },\n 0x011b: {\n 'name': 'YResolution',\n 'description': TagNamesCommon.YResolution\n },\n 0x011c: 'PlanarConfiguration',\n 0x011d: 'PageName',\n 0x011e: {\n 'name': 'XPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x011f: {\n 'name': 'YPosition',\n 'description': (value) => {\n return '' + Math.round(value[0] / value[1]);\n }\n },\n 0x0122: {\n name: 'GrayResponseUnit',\n description: (value) => ({\n 1: '0.1',\n 2: '0.001',\n 3: '0.0001',\n 4: '1e-05',\n 5: '1e-06'\n })[value] || 'Unknown'\n },\n 0x0128: {\n name: 'ResolutionUnit',\n description: TagNamesCommon.ResolutionUnit\n },\n 0x0129: 'PageNumber',\n 0x012d: 'TransferFunction',\n 0x0131: 'Software',\n 0x0132: 'DateTime',\n 0x013b: 'Artist',\n 0x013c: 'HostComputer',\n 0x013d: 'Predictor',\n 0x013e: {\n 'name': 'WhitePoint',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x013f: {\n 'name': 'PrimaryChromaticities',\n 'description': (values) => {\n return values.map((value) => `${value[0]}/${value[1]}`).join(', ');\n }\n },\n 0x0141: 'HalftoneHints',\n 0x0142: 'TileWidth',\n 0x0143: 'TileLength',\n 0x014a: 'A100DataOffset',\n 0x014c: {\n name: 'InkSet',\n description: (value) => ({\n 1: 'CMYK',\n 2: 'Not CMYK'\n })[value] || 'Unknown'\n },\n 0x0151: 'TargetPrinter',\n 0x0152: {\n name: 'ExtraSamples',\n description: (value) => ({\n 0: 'Unspecified',\n 1: 'Associated Alpha',\n 2: 'Unassociated Alpha',\n })[value] || 'Unknown'\n },\n 0x0153: {\n name: 'SampleFormat',\n description: (value) => {\n const formats = {\n 1: 'Unsigned',\n 2: 'Signed',\n 3: 'Float',\n 4: 'Undefined',\n 5: 'Complex int',\n 6: 'Complex float',\n };\n if (!Array.isArray(value)) {\n return 'Unknown';\n }\n return value.map((sample) => formats[sample] || 'Unknown').join(', ');\n }\n },\n 0x0201: 'JPEGInterchangeFormat',\n 0x0202: 'JPEGInterchangeFormatLength',\n 0x0211: {\n 'name': 'YCbCrCoefficients',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join('/');\n }\n },\n 0x0212: 'YCbCrSubSampling',\n 0x0213: {\n name: 'YCbCrPositioning',\n description: (value) => {\n if (value === 1) {\n return 'centered';\n }\n if (value === 2) {\n return 'co-sited';\n }\n return 'undefined ' + value;\n }\n },\n 0x0214: {\n 'name': 'ReferenceBlackWhite',\n 'description': (values) => {\n return values.map((value) => '' + value[0] / value[1]).join(', ');\n }\n },\n 0x02bc: 'ApplicationNotes',\n 0x4746: 'Rating',\n 0x4749: 'RatingPercent',\n 0x8298: {\n name: 'Copyright',\n description: (value) => value.join('; ')\n },\n 0x830e: 'PixelScale',\n 0x83bb: 'IPTC-NAA',\n 0x8480: 'IntergraphMatrix',\n 0x8482: 'ModelTiePoint',\n 0x8546: 'SEMInfo',\n 0x85d8: 'ModelTransform',\n 0x8649: 'PhotoshopSettings',\n 0x8769: 'Exif IFD Pointer',\n 0x8773: 'ICC_Profile',\n 0x87af: 'GeoTiffDirectory',\n 0x87b0: 'GeoTiffDoubleParams',\n 0x87b1: 'GeoTiffAsciiParams',\n 0x8825: 'GPS Info IFD Pointer',\n 0x9c9b: {\n name: 'XPTitle',\n description: decodeXPValue,\n },\n 0x9c9c: {\n name: 'XPComment',\n description: decodeXPValue\n },\n 0x9c9d: {\n name: 'XPAuthor',\n description: decodeXPValue,\n },\n 0x9c9e: {\n name: 'XPKeywords',\n description: decodeXPValue,\n },\n 0x9c9f: {\n name: 'XPSubject',\n description: decodeXPValue,\n },\n 0xa480: 'GDALMetadata',\n 0xa481: 'GDALNoData',\n 0xc4a5: 'PrintIM',\n 0xc613: 'DNGBackwardVersion',\n 0xc614: 'UniqueCameraModel',\n 0xc615: 'LocalizedCameraModel',\n 0xc621: 'ColorMatrix1',\n 0xc622: 'ColorMatrix2',\n 0xc623: 'CameraCalibration1',\n 0xc624: 'CameraCalibration2',\n 0xc625: 'ReductionMatrix1',\n 0xc626: 'ReductionMatrix2',\n 0xc627: 'AnalogBalance',\n 0xc628: 'AsShotNeutral',\n 0xc629: 'AsShotWhiteXY',\n 0xc62a: 'BaselineExposure',\n 0xc62b: 'BaselineNoise',\n 0xc62c: 'BaselineSharpness',\n 0xc62e: 'LinearResponseLimit',\n 0xc62f: 'CameraSerialNumber',\n 0xc630: 'DNGLensInfo',\n 0xc633: 'ShadowScale',\n 0xc635: {\n name: 'MakerNoteSafety',\n description: (value) => ({\n 0: 'Unsafe',\n 1: 'Safe'\n })[value] || 'Unknown'\n },\n 0xc65a: {\n name: 'CalibrationIlluminant1',\n description: TagNamesCommon['LightSource']\n },\n 0xc65b: {\n name: 'CalibrationIlluminant2',\n description: TagNamesCommon['LightSource']\n },\n 0xc65d: 'RawDataUniqueID',\n 0xc68b: 'OriginalRawFileName',\n 0xc68c: 'OriginalRawFileData',\n 0xc68f: 'AsShotICCProfile',\n 0xc690: 'AsShotPreProfileMatrix',\n 0xc691: 'CurrentICCProfile',\n 0xc692: 'CurrentPreProfileMatrix',\n 0xc6bf: 'ColorimetricReference',\n 0xc6c5: 'SRawType',\n 0xc6d2: 'PanasonicTitle',\n 0xc6d3: 'PanasonicTitle2',\n 0xc6f3: 'CameraCalibrationSig',\n 0xc6f4: 'ProfileCalibrationSig',\n 0xc6f5: 'ProfileIFD',\n 0xc6f6: 'AsShotProfileName',\n 0xc6f8: 'ProfileName',\n 0xc6f9: 'ProfileHueSatMapDims',\n 0xc6fa: 'ProfileHueSatMapData1',\n 0xc6fb: 'ProfileHueSatMapData2',\n 0xc6fc: 'ProfileToneCurve',\n 0xc6fd: {\n name: 'ProfileEmbedPolicy',\n description: (value) => ({\n 0: 'Allow Copying',\n 1: 'Embed if Used',\n 2: 'Never Embed',\n 3: 'No Restrictions'\n })[value] || 'Unknown'\n },\n 0xc6fe: 'ProfileCopyright',\n 0xc714: 'ForwardMatrix1',\n 0xc715: 'ForwardMatrix2',\n 0xc716: 'PreviewApplicationName',\n 0xc717: 'PreviewApplicationVersion',\n 0xc718: 'PreviewSettingsName',\n 0xc719: 'PreviewSettingsDigest',\n 0xc71a: {\n name: 'PreviewColorSpace',\n description: (value) => ({\n 1: 'Gray Gamma 2.2',\n 2: 'sRGB',\n 3: 'Adobe RGB',\n 4: 'ProPhoto RGB'\n })[value] || 'Unknown'\n },\n 0xc71b: 'PreviewDateTime',\n 0xc71c: 'RawImageDigest',\n 0xc71d: 'OriginalRawFileDigest',\n 0xc725: 'ProfileLookTableDims',\n 0xc726: 'ProfileLookTableData',\n 0xc763: 'TimeCodes',\n 0xc764: 'FrameRate',\n 0xc772: 'TStop',\n 0xc789: 'ReelName',\n 0xc791: 'OriginalDefaultFinalSize',\n 0xc792: 'OriginalBestQualitySize',\n 0xc793: 'OriginalDefaultCropSize',\n 0xc7a1: 'CameraLabel',\n 0xc7a3: {\n name: 'ProfileHueSatMapEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a4: {\n name: 'ProfileLookTableEncoding',\n description: (value) => ({\n 0: 'Linear',\n 1: 'sRGB'\n })[value] || 'Unknown'\n },\n 0xc7a5: 'BaselineExposureOffset',\n 0xc7a6: {\n name: 'DefaultBlackRender',\n description: (value) => ({\n 0: 'Auto',\n 1: 'None'\n })[value] || 'Unknown'\n },\n 0xc7a7: 'NewRawImageDigest',\n 0xc7a8: 'RawToPreviewGain'\n};\n\nfunction decodeXPValue(value) {\n // The XP tags are encoded as UCS-2 which uses two bytes per character but\n // it's close to UTF-16 so we can use that to decode them.\n // https://www.loc.gov/preservation/digital/formats/content/tiff_tags.shtml\n const decodedValue = new TextDecoder('utf-16').decode(new Uint8Array(value));\n // Some softwares pad the string with null characters so we remove them.\n return decodedValue.replace(/\\u0000+$/, ''); // eslint-disable-line no-control-regex\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue, getEncodedString} from './tag-names-utils.js';\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 0x829a: {\n 'name': 'ExposureTime',\n 'description': TagNamesCommon.ExposureTime\n },\n 0x829d: {\n 'name': 'FNumber',\n 'description': TagNamesCommon.FNumber\n },\n 0x8822: {\n 'name': 'ExposureProgram',\n 'description': TagNamesCommon.ExposureProgram\n },\n 0x8824: 'SpectralSensitivity',\n 0x8827: 'ISOSpeedRatings',\n 0x8828: {\n 'name': 'OECF',\n 'description': () => '[Raw OECF table data]'\n },\n 0x882a: 'TimeZoneOffset',\n 0x882b: 'SelfTimerMode',\n 0x8830: {\n name: 'SensitivityType',\n description: (value) => ({\n 1: 'Standard Output Sensitivity',\n 2: 'Recommended Exposure Index',\n 3: 'ISO Speed',\n 4: 'Standard Output Sensitivity and Recommended Exposure Index',\n 5: 'Standard Output Sensitivity and ISO Speed',\n 6: 'Recommended Exposure Index and ISO Speed',\n 7: 'Standard Output Sensitivity, Recommended Exposure Index and ISO Speed'\n })[value] || 'Unknown'\n },\n 0x8831: 'StandardOutputSensitivity',\n 0x8832: 'RecommendedExposureIndex',\n 0x8833: 'ISOSpeed',\n 0x8834: 'ISOSpeedLatitudeyyy',\n 0x8835: 'ISOSpeedLatitudezzz',\n 0x9000: {\n 'name': 'ExifVersion',\n 'description': (value) => getStringValue(value)\n },\n 0x9003: 'DateTimeOriginal',\n 0x9004: 'DateTimeDigitized',\n 0x9009: 'GooglePlusUploadCode',\n 0x9010: 'OffsetTime',\n 0x9011: 'OffsetTimeOriginal',\n 0x9012: 'OffsetTimeDigitized',\n 0x9101: {\n 'name': 'ComponentsConfiguration',\n 'description': TagNamesCommon.ComponentsConfiguration\n },\n 0x9102: 'CompressedBitsPerPixel',\n 0x9201: {\n 'name': 'ShutterSpeedValue',\n 'description': TagNamesCommon.ShutterSpeedValue\n },\n 0x9202: {\n 'name': 'ApertureValue',\n 'description': TagNamesCommon.ApertureValue\n },\n 0x9203: 'BrightnessValue',\n 0x9204: 'ExposureBiasValue',\n 0x9205: {\n 'name': 'MaxApertureValue',\n 'description': (value) => {\n return Math.pow(Math.sqrt(2), value[0] / value[1]).toFixed(2);\n }\n },\n 0x9206: {\n 'name': 'SubjectDistance',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9207: {\n 'name': 'MeteringMode',\n 'description': TagNamesCommon.MeteringMode\n },\n 0x9208: {\n 'name': 'LightSource',\n description: TagNamesCommon.LightSource\n },\n 0x9209: {\n 'name': 'Flash',\n 'description': (value) => {\n if (value === 0x00) {\n return 'Flash did not fire';\n } else if (value === 0x01) {\n return 'Flash fired';\n } else if (value === 0x05) {\n return 'Strobe return light not detected';\n } else if (value === 0x07) {\n return 'Strobe return light detected';\n } else if (value === 0x09) {\n return 'Flash fired, compulsory flash mode';\n } else if (value === 0x0d) {\n return 'Flash fired, compulsory flash mode, return light not detected';\n } else if (value === 0x0f) {\n return 'Flash fired, compulsory flash mode, return light detected';\n } else if (value === 0x10) {\n return 'Flash did not fire, compulsory flash mode';\n } else if (value === 0x18) {\n return 'Flash did not fire, auto mode';\n } else if (value === 0x19) {\n return 'Flash fired, auto mode';\n } else if (value === 0x1d) {\n return 'Flash fired, auto mode, return light not detected';\n } else if (value === 0x1f) {\n return 'Flash fired, auto mode, return light detected';\n } else if (value === 0x20) {\n return 'No flash function';\n } else if (value === 0x41) {\n return 'Flash fired, red-eye reduction mode';\n } else if (value === 0x45) {\n return 'Flash fired, red-eye reduction mode, return light not detected';\n } else if (value === 0x47) {\n return 'Flash fired, red-eye reduction mode, return light detected';\n } else if (value === 0x49) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode';\n } else if (value === 0x4d) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected';\n } else if (value === 0x4f) {\n return 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected';\n } else if (value === 0x59) {\n return 'Flash fired, auto mode, red-eye reduction mode';\n } else if (value === 0x5d) {\n return 'Flash fired, auto mode, return light not detected, red-eye reduction mode';\n } else if (value === 0x5f) {\n return 'Flash fired, auto mode, return light detected, red-eye reduction mode';\n }\n return 'Unknown';\n }\n },\n 0x920a: {\n 'name': 'FocalLength',\n 'description': TagNamesCommon.FocalLength\n },\n 0x9211: 'ImageNumber',\n 0x9212: {\n name: 'SecurityClassification',\n description: (value) => ({\n 'C': 'Confidential',\n 'R': 'Restricted',\n 'S': 'Secret',\n 'T': 'Top Secret',\n 'U': 'Unclassified'\n })[value] || 'Unknown'\n },\n 0x9213: 'ImageHistory',\n 0x9214: {\n 'name': 'SubjectArea',\n 'description': (value) => {\n if (value.length === 2) {\n return `Location; X: ${value[0]}, Y: ${value[1]}`;\n } else if (value.length === 3) {\n return `Circle; X: ${value[0]}, Y: ${value[1]}, diameter: ${value[2]}`;\n } else if (value.length === 4) {\n return `Rectangle; X: ${value[0]}, Y: ${value[1]}, width: ${value[2]}, height: ${value[3]}`;\n }\n return 'Unknown';\n }\n },\n 0x927c: {\n 'name': 'MakerNote',\n 'description': () => '[Raw maker note data]'\n },\n 0x9286: {\n 'name': 'UserComment',\n 'description': getEncodedString\n },\n 0x9290: 'SubSecTime',\n 0x9291: 'SubSecTimeOriginal',\n 0x9292: 'SubSecTimeDigitized',\n 0x935c: 'ImageSourceData',\n 0x9400: {\n 'name': 'AmbientTemperature',\n 'description': (value) => (value[0] / value[1]) + ' °C'\n },\n 0x9401: {\n 'name': 'Humidity',\n 'description': (value) => (value[0] / value[1]) + ' %'\n },\n 0x9402: {\n 'name': 'Pressure',\n 'description': (value) => (value[0] / value[1]) + ' hPa'\n },\n 0x9403: {\n 'name': 'WaterDepth',\n 'description': (value) => (value[0] / value[1]) + ' m'\n },\n 0x9404: {\n 'name': 'Acceleration',\n 'description': (value) => (value[0] / value[1]) + ' mGal'\n },\n 0x9405: {\n 'name': 'CameraElevationAngle',\n 'description': (value) => (value[0] / value[1]) + ' °'\n },\n 0xa000: {\n 'name': 'FlashpixVersion',\n 'description': (value) => value.map((charCode) => String.fromCharCode(charCode)).join('')\n },\n 0xa001: {\n 'name': 'ColorSpace',\n 'description': TagNamesCommon.ColorSpace\n },\n 0xa002: 'PixelXDimension',\n 0xa003: 'PixelYDimension',\n 0xa004: 'RelatedSoundFile',\n 0xa005: 'Interoperability IFD Pointer',\n 0xa20b: 'FlashEnergy',\n 0xa20c: {\n 'name': 'SpatialFrequencyResponse',\n 'description': () => '[Raw SFR table data]'\n },\n 0xa20e: 'FocalPlaneXResolution',\n 0xa20f: 'FocalPlaneYResolution',\n 0xa210: {\n 'name': 'FocalPlaneResolutionUnit',\n 'description': TagNamesCommon.FocalPlaneResolutionUnit\n },\n 0xa214: {\n 'name': 'SubjectLocation',\n 'description': ([x, y]) => `X: ${x}, Y: ${y}`\n },\n 0xa215: 'ExposureIndex',\n 0xa217: {\n 'name': 'SensingMethod',\n 'description': (value) => {\n if (value === 1) {\n return 'Undefined';\n } else if (value === 2) {\n return 'One-chip color area sensor';\n } else if (value === 3) {\n return 'Two-chip color area sensor';\n } else if (value === 4) {\n return 'Three-chip color area sensor';\n } else if (value === 5) {\n return 'Color sequential area sensor';\n } else if (value === 7) {\n return 'Trilinear sensor';\n } else if (value === 8) {\n return 'Color sequential linear sensor';\n }\n return 'Unknown';\n }\n },\n 0xa300: {\n 'name': 'FileSource',\n 'description': (value) => {\n if (value === 3) {\n return 'DSC';\n }\n return 'Unknown';\n }\n },\n 0xa301: {\n 'name': 'SceneType',\n 'description': (value) => {\n if (value === 1) {\n return 'A directly photographed image';\n }\n return 'Unknown';\n }\n },\n 0xa302: {\n 'name': 'CFAPattern',\n 'description': () => '[Raw CFA pattern table data]'\n },\n 0xa401: {\n 'name': 'CustomRendered',\n 'description': TagNamesCommon.CustomRendered\n },\n 0xa402: {\n 'name': 'ExposureMode',\n 'description': TagNamesCommon.ExposureMode\n },\n 0xa403: {\n 'name': 'WhiteBalance',\n 'description': TagNamesCommon.WhiteBalance\n },\n 0xa404: {\n 'name': 'DigitalZoomRatio',\n 'description': (value) => {\n if (value[0] === 0) {\n return 'Digital zoom was not used';\n }\n return '' + (value[0] / value[1]);\n }\n },\n 0xa405: {\n 'name': 'FocalLengthIn35mmFilm',\n 'description': (value) => {\n if (value === 0) {\n return 'Unknown';\n }\n return value;\n }\n },\n 0xa406: {\n 'name': 'SceneCaptureType',\n 'description': TagNamesCommon.SceneCaptureType\n },\n 0xa407: {\n 'name': 'GainControl',\n 'description': (value) => {\n if (value === 0) {\n return 'None';\n } else if (value === 1) {\n return 'Low gain up';\n } else if (value === 2) {\n return 'High gain up';\n } else if (value === 3) {\n return 'Low gain down';\n } else if (value === 4) {\n return 'High gain down';\n }\n return 'Unknown';\n }\n },\n 0xa408: {\n 'name': 'Contrast',\n 'description': TagNamesCommon.Contrast\n },\n 0xa409: {\n 'name': 'Saturation',\n 'description': TagNamesCommon.Saturation\n },\n 0xa40a: {\n 'name': 'Sharpness',\n 'description': TagNamesCommon.Sharpness\n },\n 0xa40b: {\n 'name': 'DeviceSettingDescription',\n 'description': () => '[Raw device settings table data]'\n },\n 0xa40c: {\n 'name': 'SubjectDistanceRange',\n 'description': (value) => {\n if (value === 1) {\n return 'Macro';\n } else if (value === 2) {\n return 'Close view';\n } else if (value === 3) {\n return 'Distant view';\n }\n return 'Unknown';\n }\n },\n 0xa420: 'ImageUniqueID',\n 0xa430: 'CameraOwnerName',\n 0xa431: 'BodySerialNumber',\n 0xa432: {\n 'name': 'LensSpecification',\n 'description': (value) => {\n const focalLengthFrom = parseFloat((value[0][0] / value[0][1]).toFixed(5));\n const focalLengthTo = parseFloat((value[1][0] / value[1][1]).toFixed(5));\n const focalLengths = `${focalLengthFrom}-${focalLengthTo} mm`;\n if (value[3][1] === 0) {\n return `${focalLengths} f/?`;\n }\n const maxAperture = 1 / ((value[2][1] / value[2][1]) / (value[3][0] / value[3][1]));\n return `${focalLengths} f/${parseFloat(maxAperture.toFixed(5))}`;\n }\n },\n 0xa433: 'LensMake',\n 0xa434: 'LensModel',\n 0xa435: 'LensSerialNumber',\n 0xa460: {\n name: 'CompositeImage',\n description: (value) => ({\n 1: 'Not a Composite Image',\n 2: 'General Composite Image',\n 3: 'Composite Image Captured While Shooting',\n })[value] || 'Unknown'\n },\n 0xa461: 'SourceImageNumberOfCompositeImage',\n 0xa462: 'SourceExposureTimesOfCompositeImage',\n 0xa500: 'Gamma',\n 0xea1c: 'Padding',\n 0xea1d: 'OffsetSchema',\n 0xfde8: 'OwnerName',\n 0xfde9: 'SerialNumber',\n 0xfdea: 'Lens',\n 0xfe4c: 'RawFile',\n 0xfe4d: 'Converter',\n 0xfe4e: 'WhiteBalance',\n 0xfe51: 'Exposure',\n 0xfe52: 'Shadows',\n 0xfe53: 'Brightness',\n 0xfe54: 'Contrast',\n 0xfe55: 'Saturation',\n 0xfe56: 'Sharpness',\n 0xfe57: 'Smoothness',\n 0xfe58: 'MoireFilter'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getEncodedString, getCalculatedGpsValue} from './tag-names-utils.js';\n\nexport default {\n 0x0000: {\n 'name': 'GPSVersionID',\n 'description': (value) => {\n if (value[0] === 2 && value[1] === 2 && value[2] === 0 && value[3] === 0) {\n return 'Version 2.2';\n }\n return 'Unknown';\n }\n },\n 0x0001: {\n 'name': 'GPSLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0002: {\n 'name': 'GPSLatitude',\n 'description': getCalculatedGpsValue\n },\n 0x0003: {\n 'name': 'GPSLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0004: {\n 'name': 'GPSLongitude',\n 'description': getCalculatedGpsValue\n },\n 0x0005: {\n 'name': 'GPSAltitudeRef',\n 'description': (value) => {\n if (value === 0) {\n return 'Sea level';\n } else if (value === 1) {\n return 'Sea level reference (negative value)';\n }\n return 'Unknown';\n }\n },\n 0x0006: {\n 'name': 'GPSAltitude',\n 'description': (value) => {\n return (value[0] / value[1]) + ' m';\n }\n },\n 0x0007: {\n 'name': 'GPSTimeStamp',\n 'description': (values) => {\n return values.map(([numerator, denominator]) => {\n const num = numerator / denominator;\n if (/^\\d(\\.|$)/.test(`${num}`)) {\n return `0${num}`;\n }\n return num;\n }).join(':');\n }\n },\n 0x0008: 'GPSSatellites',\n 0x0009: {\n 'name': 'GPSStatus',\n 'description': (value) => {\n const status = value.join('');\n if (status === 'A') {\n return 'Measurement in progress';\n } else if (status === 'V') {\n return 'Measurement Interoperability';\n }\n return 'Unknown';\n }\n },\n 0x000a: {\n 'name': 'GPSMeasureMode',\n 'description': (value) => {\n const mode = value.join('');\n if (mode === '2') {\n return '2-dimensional measurement';\n } else if (mode === '3') {\n return '3-dimensional measurement';\n }\n return 'Unknown';\n }\n },\n 0x000b: 'GPSDOP',\n 0x000c: {\n 'name': 'GPSSpeedRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers per hour';\n } else if (ref === 'M') {\n return 'Miles per hour';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x000d: 'GPSSpeed',\n 0x000e: {\n 'name': 'GPSTrackRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x000f: 'GPSTrack',\n 0x0010: {\n 'name': 'GPSImgDirectionRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0011: 'GPSImgDirection',\n 0x0012: 'GPSMapDatum',\n 0x0013: {\n 'name': 'GPSDestLatitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'N') {\n return 'North latitude';\n } else if (ref === 'S') {\n return 'South latitude';\n }\n return 'Unknown';\n }\n },\n 0x0014: {\n 'name': 'GPSDestLatitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0015: {\n 'name': 'GPSDestLongitudeRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'E') {\n return 'East longitude';\n } else if (ref === 'W') {\n return 'West longitude';\n }\n return 'Unknown';\n }\n },\n 0x0016: {\n 'name': 'GPSDestLongitude',\n 'description': (value) => {\n return (value[0][0] / value[0][1]) + (value[1][0] / value[1][1]) / 60 + (value[2][0] / value[2][1]) / 3600;\n }\n },\n 0x0017: {\n 'name': 'GPSDestBearingRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'T') {\n return 'True direction';\n } else if (ref === 'M') {\n return 'Magnetic direction';\n }\n return 'Unknown';\n }\n },\n 0x0018: 'GPSDestBearing',\n 0x0019: {\n 'name': 'GPSDestDistanceRef',\n 'description': (value) => {\n const ref = value.join('');\n if (ref === 'K') {\n return 'Kilometers';\n } else if (ref === 'M') {\n return 'Miles';\n } else if (ref === 'N') {\n return 'Knots';\n }\n return 'Unknown';\n }\n },\n 0x001a: 'GPSDestDistance',\n 0x001b: {\n 'name': 'GPSProcessingMethod',\n 'description': getEncodedString\n },\n 0x001c: {\n 'name': 'GPSAreaInformation',\n 'description': getEncodedString\n },\n 0x001d: 'GPSDateStamp',\n 0x001e: {\n 'name': 'GPSDifferential',\n 'description': (value) => {\n if (value === 0) {\n return 'Measurement without differential correction';\n } else if (value === 1) {\n return 'Differential correction applied';\n }\n return 'Unknown';\n }\n },\n 0x001f: 'GPSHPositioningError'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0x0001: 'InteroperabilityIndex',\n 0x0002: {\n name: 'InteroperabilityVersion',\n description: (value) => getStringValue(value)\n },\n 0x1000: 'RelatedImageFileFormat',\n 0x1001: 'RelatedImageWidth',\n 0x1002: 'RelatedImageHeight'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 0xb000: {\n 'name': 'MPFVersion',\n 'description': (value) => getStringValue(value)\n },\n 0xb001: 'NumberOfImages',\n 0xb002: 'MPEntry',\n 0xb003: 'ImageUIDList',\n 0xb004: 'TotalFrames'\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n 0x0004: {\n 'name': 'ShotInfo',\n 'description': (value) => value\n },\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport Constants from './constants.js';\nimport TagNames0thIfd from './tag-names-0th-ifd.js';\nimport TagNamesExifIfd from './tag-names-exif-ifd.js';\nimport TagNamesGpsIfd from './tag-names-gps-ifd.js';\nimport TagNamesInteroperabilityIfd from './tag-names-interoperability-ifd.js';\nimport TagNamesMpfIfd from './tag-names-mpf-ifd.js';\nimport TagNamesCanonIfd from './tag-names-canon-ifd.js';\n\nconst tagNames0thExifIfds = objectAssign({}, TagNames0thIfd, TagNamesExifIfd);\n\nexport const IFD_TYPE_0TH = '0th';\nexport const IFD_TYPE_1ST = '1st';\nexport const IFD_TYPE_EXIF = 'exif';\nexport const IFD_TYPE_GPS = 'gps';\nexport const IFD_TYPE_INTEROPERABILITY = 'interoperability';\nexport const IFD_TYPE_MPF = 'mpf';\nexport const IFD_TYPE_CANON = 'canon';\n\nexport default {\n [IFD_TYPE_0TH]: tagNames0thExifIfds,\n [IFD_TYPE_1ST]: TagNames0thIfd,\n [IFD_TYPE_EXIF]: tagNames0thExifIfds,\n [IFD_TYPE_GPS]: TagNamesGpsIfd,\n [IFD_TYPE_INTEROPERABILITY]: TagNamesInteroperabilityIfd,\n [IFD_TYPE_MPF]: Constants.USE_MPF ? TagNamesMpfIfd : {},\n [IFD_TYPE_CANON]: Constants.USE_MAKER_NOTES ? TagNamesCanonIfd : {},\n};\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\n\nconst typeSizes = {\n 1: 1, // BYTE\n 2: 1, // ASCII\n 3: 2, // SHORT\n 4: 4, // LONG\n 5: 8, // RATIONAL\n 7: 1, // UNDEFINED\n 9: 4, // SLONG\n 10: 8, // SRATIONAL\n 13: 4 // IFD\n};\n\nconst tagTypes = {\n 'BYTE': 1,\n 'ASCII': 2,\n 'SHORT': 3,\n 'LONG': 4,\n 'RATIONAL': 5,\n 'UNDEFINED': 7,\n 'SLONG': 9,\n 'SRATIONAL': 10,\n 'IFD': 13\n};\n\nexport default {\n getAsciiValue,\n getByteAt,\n getAsciiAt,\n getShortAt,\n getLongAt,\n getRationalAt,\n getUndefinedAt,\n getSlongAt,\n getSrationalAt,\n getIfdPointerAt,\n typeSizes,\n tagTypes,\n getTypeSize\n};\n\nfunction getAsciiValue(charArray) {\n return charArray.map((charCode) => String.fromCharCode(charCode));\n}\n\nfunction getByteAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getAsciiAt(dataView, offset) {\n return dataView.getUint8(offset);\n}\n\nfunction getShortAt(dataView, offset, byteOrder) {\n return dataView.getUint16(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getLongAt(dataView, offset, byteOrder) {\n return dataView.getUint32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getRationalAt(dataView, offset, byteOrder) {\n return [getLongAt(dataView, offset, byteOrder), getLongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getUndefinedAt(dataView, offset) {\n return getByteAt(dataView, offset);\n}\n\nfunction getSlongAt(dataView, offset, byteOrder) {\n return dataView.getInt32(offset, byteOrder === ByteOrder.LITTLE_ENDIAN);\n}\n\nfunction getSrationalAt(dataView, offset, byteOrder) {\n return [getSlongAt(dataView, offset, byteOrder), getSlongAt(dataView, offset + 4, byteOrder)];\n}\n\nfunction getIfdPointerAt(dataView, offset, byteOrder) {\n return getLongAt(dataView, offset, byteOrder);\n}\n\nfunction getTypeSize(typeName) {\n if (tagTypes[typeName] === undefined) {\n throw new Error('No such type found.');\n }\n\n return typeSizes[tagTypes[typeName]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Constants from './constants.js';\nimport Types from './types.js';\nimport TagNames, {IFD_TYPE_0TH, IFD_TYPE_1ST} from './tag-names.js';\n\nconst getTagValueAt = {\n 1: Types.getByteAt,\n 2: Types.getAsciiAt,\n 3: Types.getShortAt,\n 4: Types.getLongAt,\n 5: Types.getRationalAt,\n 7: Types.getUndefinedAt,\n 9: Types.getSlongAt,\n 10: Types.getSrationalAt,\n 13: Types.getIfdPointerAt\n};\n\nexport function get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder) {\n return tiffHeaderOffset + Types.getLongAt(dataView, tiffHeaderOffset + 4, byteOrder);\n}\n\nexport function readIfd(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const FIELD_COUNT_SIZE = Types.getTypeSize('SHORT');\n const FIELD_SIZE = 12;\n\n const tags = {};\n const numberOfFields = getNumberOfFields(dataView, offset, byteOrder);\n\n offset += FIELD_COUNT_SIZE;\n for (let fieldIndex = 0; fieldIndex < numberOfFields; fieldIndex++) {\n if (offset + FIELD_SIZE > dataView.byteLength) {\n break;\n }\n\n const tag = readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown);\n if (tag !== undefined) {\n tags[tag.name] = {\n 'id': tag.id,\n 'value': tag.value,\n 'description': tag.description\n };\n if (tag.name === 'MakerNote') {\n tags[tag.name].__offset = tag.__offset;\n }\n }\n\n offset += FIELD_SIZE;\n }\n\n if (Constants.USE_THUMBNAIL && (offset < dataView.byteLength - Types.getTypeSize('LONG'))) {\n const nextIfdOffset = Types.getLongAt(dataView, offset, byteOrder);\n if (nextIfdOffset !== 0 && ifdType === IFD_TYPE_0TH) {\n tags['Thumbnail'] = readIfd(dataView, IFD_TYPE_1ST, tiffHeaderOffset, tiffHeaderOffset + nextIfdOffset, byteOrder, includeUnknown);\n }\n }\n\n return tags;\n}\n\nfunction getNumberOfFields(dataView, offset, byteOrder) {\n if (offset + Types.getTypeSize('SHORT') <= dataView.byteLength) {\n return Types.getShortAt(dataView, offset, byteOrder);\n }\n return 0;\n}\n\nfunction readTag(dataView, ifdType, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n const TAG_CODE_IPTC_NAA = 0x83bb;\n const TAG_TYPE_OFFSET = Types.getTypeSize('SHORT');\n const TAG_COUNT_OFFSET = TAG_TYPE_OFFSET + Types.getTypeSize('SHORT');\n const TAG_VALUE_OFFSET = TAG_COUNT_OFFSET + Types.getTypeSize('LONG');\n\n const tagCode = Types.getShortAt(dataView, offset, byteOrder);\n const tagType = Types.getShortAt(dataView, offset + TAG_TYPE_OFFSET, byteOrder);\n const tagCount = Types.getLongAt(dataView, offset + TAG_COUNT_OFFSET, byteOrder);\n let tagValue;\n let tagValueOffset;\n\n if (Types.typeSizes[tagType] === undefined || (!includeUnknown && TagNames[ifdType][tagCode] === undefined)) {\n return undefined;\n }\n\n if (tagValueFitsInOffsetSlot(tagType, tagCount)) {\n tagValueOffset = offset + TAG_VALUE_OFFSET;\n tagValue = getTagValue(dataView, tagValueOffset, tagType, tagCount, byteOrder);\n } else {\n tagValueOffset = Types.getLongAt(dataView, offset + TAG_VALUE_OFFSET, byteOrder);\n if (tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount)) {\n const forceByteType = tagCode === TAG_CODE_IPTC_NAA;\n tagValue = getTagValue(dataView, tiffHeaderOffset + tagValueOffset, tagType, tagCount, byteOrder, forceByteType);\n } else {\n tagValue = '';\n }\n }\n\n if (tagType === Types.tagTypes['ASCII']) {\n tagValue = splitNullSeparatedAsciiString(tagValue);\n tagValue = decodeAsciiValue(tagValue);\n }\n\n let tagName = `undefined-${tagCode}`;\n let tagDescription = tagValue;\n\n if (TagNames[ifdType][tagCode] !== undefined) {\n if ((TagNames[ifdType][tagCode]['name'] !== undefined) && (TagNames[ifdType][tagCode]['description'] !== undefined)) {\n tagName = TagNames[ifdType][tagCode]['name'];\n try {\n tagDescription = TagNames[ifdType][tagCode]['description'](tagValue);\n } catch (error) {\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n } else if ((tagType === Types.tagTypes['RATIONAL']) || (tagType === Types.tagTypes['SRATIONAL'])) {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = '' + (tagValue[0] / tagValue[1]);\n } else {\n tagName = TagNames[ifdType][tagCode];\n tagDescription = getDescriptionFromTagValue(tagValue);\n }\n }\n\n return {\n id: tagCode,\n name: tagName,\n value: tagValue,\n description: tagDescription,\n __offset: tagValueOffset\n };\n}\n\nfunction tagValueFitsInOffsetSlot(tagType, tagCount) {\n return Types.typeSizes[tagType] * tagCount <= Types.getTypeSize('LONG');\n}\n\nfunction getTagValue(dataView, offset, type, count, byteOrder, forceByteType = false) {\n let value = [];\n\n if (forceByteType) {\n count = count * Types.typeSizes[type];\n type = Types.tagTypes['BYTE'];\n }\n for (let valueIndex = 0; valueIndex < count; valueIndex++) {\n value.push(getTagValueAt[type](dataView, offset, byteOrder));\n offset += Types.typeSizes[type];\n }\n\n if (type === Types.tagTypes['ASCII']) {\n value = Types.getAsciiValue(value);\n } else if (value.length === 1) {\n value = value[0];\n }\n\n return value;\n}\n\nfunction tagValueFitsInDataView(dataView, tiffHeaderOffset, tagValueOffset, tagType, tagCount) {\n return tiffHeaderOffset + tagValueOffset + Types.typeSizes[tagType] * tagCount <= dataView.byteLength;\n}\n\nfunction splitNullSeparatedAsciiString(string) {\n const tagValue = [];\n let i = 0;\n\n for (let j = 0; j < string.length; j++) {\n if (string[j] === '\\x00') {\n i++;\n continue;\n }\n if (tagValue[i] === undefined) {\n tagValue[i] = '';\n }\n tagValue[i] += string[j];\n }\n\n return tagValue;\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return asciiValue.map((value) => decodeURIComponent(escape(value)));\n } catch (error) {\n return asciiValue;\n }\n}\n\nfunction getDescriptionFromTagValue(tagValue) {\n if (tagValue instanceof Array) {\n return tagValue.join(', ');\n }\n return tagValue;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {objectAssign} from './utils.js';\nimport ByteOrder from './byte-order.js';\nimport {IFD_TYPE_0TH, IFD_TYPE_EXIF, IFD_TYPE_GPS, IFD_TYPE_INTEROPERABILITY} from './tag-names.js';\nimport {readIfd, get0thIfdOffset} from './tags-helpers.js';\n\nconst EXIF_IFD_POINTER_KEY = 'Exif IFD Pointer';\nconst GPS_INFO_IFD_POINTER_KEY = 'GPS Info IFD Pointer';\nconst INTEROPERABILITY_IFD_POINTER_KEY = 'Interoperability IFD Pointer';\n\nexport default {\n read,\n};\n\nfunction read(dataView, tiffHeaderOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, tiffHeaderOffset);\n let tags = read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n tags = readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown);\n\n return {tags, byteOrder};\n}\n\nfunction read0thIfd(dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n return readIfd(dataView, IFD_TYPE_0TH, tiffHeaderOffset, get0thIfdOffset(dataView, tiffHeaderOffset, byteOrder), byteOrder, includeUnknown);\n}\n\nfunction readExifIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[EXIF_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_EXIF, tiffHeaderOffset, tiffHeaderOffset + tags[EXIF_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readGpsIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[GPS_INFO_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_GPS, tiffHeaderOffset, tiffHeaderOffset + tags[GPS_INFO_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n\nfunction readInteroperabilityIfd(tags, dataView, tiffHeaderOffset, byteOrder, includeUnknown) {\n if (tags[INTEROPERABILITY_IFD_POINTER_KEY] !== undefined) {\n return objectAssign(tags, readIfd(dataView, IFD_TYPE_INTEROPERABILITY, tiffHeaderOffset, tiffHeaderOffset + tags[INTEROPERABILITY_IFD_POINTER_KEY].value, byteOrder, includeUnknown));\n }\n\n return tags;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport ByteOrder from './byte-order.js';\nimport Types from './types.js';\nimport {IFD_TYPE_MPF} from './tag-names.js';\nimport {deferInit, getBase64Image} from './utils.js';\nimport {readIfd, get0thIfdOffset} from './tags-helpers.js';\n\nexport default {\n read\n};\n\nconst ENTRY_SIZE = 16;\n\nfunction read(dataView, dataOffset, includeUnknown) {\n const byteOrder = ByteOrder.getByteOrder(dataView, dataOffset);\n const tags = readIfd(dataView, IFD_TYPE_MPF, dataOffset, get0thIfdOffset(dataView, dataOffset, byteOrder), byteOrder, includeUnknown);\n return addMpfImages(dataView, dataOffset, tags, byteOrder);\n}\n\nfunction addMpfImages(dataView, dataOffset, tags, byteOrder) {\n if (!tags['MPEntry']) {\n return tags;\n }\n\n const images = [];\n for (let i = 0; i < Math.ceil(tags['MPEntry'].value.length / ENTRY_SIZE); i++) {\n images[i] = {};\n\n const attributes = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageFlags'] = getImageFlags(attributes);\n images[i]['ImageFormat'] = getImageFormat(attributes);\n images[i]['ImageType'] = getImageType(attributes);\n\n const imageSize = getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 4, Types.getTypeSize('LONG'), byteOrder);\n images[i]['ImageSize'] = {\n value: imageSize,\n description: '' + imageSize\n };\n\n const imageOffset = getImageOffset(i, tags['MPEntry'], byteOrder, dataOffset);\n images[i]['ImageOffset'] = {\n value: imageOffset,\n description: '' + imageOffset\n };\n\n const dependentImage1EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 12, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage1EntryNumber'] = {\n value: dependentImage1EntryNumber,\n description: '' + dependentImage1EntryNumber\n };\n\n const dependentImage2EntryNumber =\n getImageNumberValue(tags['MPEntry'].value, i * ENTRY_SIZE + 14, Types.getTypeSize('SHORT'), byteOrder);\n images[i]['DependentImage2EntryNumber'] = {\n value: dependentImage2EntryNumber,\n description: '' + dependentImage2EntryNumber\n };\n\n images[i].image = dataView.buffer.slice(imageOffset, imageOffset + imageSize);\n deferInit(images[i], 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n tags['Images'] = images;\n\n return tags;\n}\n\nfunction getImageNumberValue(entries, offset, size, byteOrder) {\n if (byteOrder === ByteOrder.LITTLE_ENDIAN) {\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * i);\n }\n return value;\n }\n\n let value = 0;\n for (let i = 0; i < size; i++) {\n value += entries[offset + i] << (8 * (size - 1 - i));\n }\n return value;\n}\n\nfunction getImageFlags(attributes) {\n const flags = [\n (attributes >> 31) & 0x1,\n (attributes >> 30) & 0x1,\n (attributes >> 29) & 0x1\n ];\n\n const flagsDescription = [];\n\n if (flags[0]) {\n flagsDescription.push('Dependent Parent Image');\n }\n if (flags[1]) {\n flagsDescription.push('Dependent Child Image');\n }\n if (flags[2]) {\n flagsDescription.push('Representative Image');\n }\n\n return {\n value: flags,\n description: flagsDescription.join(', ') || 'None'\n };\n}\n\nfunction getImageFormat(attributes) {\n const imageFormat = attributes >> 24 & 0x7;\n return {\n value: imageFormat,\n description: imageFormat === 0 ? 'JPEG' : 'Unknown'\n };\n}\n\nfunction getImageType(attributes) {\n const type = attributes & 0xffffff;\n const descriptions = {\n 0x30000: 'Baseline MP Primary Image',\n 0x10001: 'Large Thumbnail (VGA equivalent)',\n 0x10002: 'Large Thumbnail (Full HD equivalent)',\n 0x20001: 'Multi-Frame Image (Panorama)',\n 0x20002: 'Multi-Frame Image (Disparity)',\n 0x20003: 'Multi-Frame Image (Multi-Angle)',\n 0x0: 'Undefined',\n };\n\n return {\n value: type,\n description: descriptions[type] || 'Unknown'\n };\n}\n\nfunction getImageOffset(imageIndex, mpEntry, byteOrder, dataOffset) {\n if (isFirstIndividualImage(imageIndex)) {\n return 0;\n }\n return getImageNumberValue(mpEntry.value, imageIndex * ENTRY_SIZE + 8, Types.getTypeSize('LONG'), byteOrder) + dataOffset;\n}\n\nfunction isFirstIndividualImage(imageIndex) {\n return imageIndex === 0;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n const length = getLength(dataView, fileDataOffset);\n const numberOfColorComponents = getNumberOfColorComponents(dataView, fileDataOffset, length);\n return {\n 'Bits Per Sample': getDataPrecision(dataView, fileDataOffset, length),\n 'Image Height': getImageHeight(dataView, fileDataOffset, length),\n 'Image Width': getImageWidth(dataView, fileDataOffset, length),\n 'Color Components': numberOfColorComponents,\n 'Subsampling': numberOfColorComponents && getSubsampling(dataView, fileDataOffset, numberOfColorComponents.value, length)\n };\n}\n\nfunction getLength(dataView, fileDataOffset) {\n return Types.getShortAt(dataView, fileDataOffset);\n}\n\nfunction getDataPrecision(dataView, fileDataOffset, length) {\n const OFFSET = 2;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset, length) {\n const OFFSET = 3;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset, length) {\n const OFFSET = 5;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getNumberOfColorComponents(dataView, fileDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getSubsampling(dataView, fileDataOffset, numberOfColorComponents, length) {\n const OFFSET = 8;\n const SIZE = 3 * numberOfColorComponents;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const components = [];\n\n for (let i = 0; i < numberOfColorComponents; i++) {\n const componentOffset = fileDataOffset + OFFSET + i * 3;\n components.push([\n Types.getByteAt(dataView, componentOffset),\n Types.getByteAt(dataView, componentOffset + 1),\n Types.getByteAt(dataView, componentOffset + 2)\n ]);\n }\n\n return {\n value: components,\n description: components.length > 1 ? getComponentIds(components) + getSamplingType(components) : ''\n };\n}\n\nfunction getComponentIds(components) {\n const ids = {\n 0x01: 'Y',\n 0x02: 'Cb',\n 0x03: 'Cr',\n 0x04: 'I',\n 0x05: 'Q',\n };\n\n return components.map((compontent) => ids[compontent[0]]).join('');\n}\n\nfunction getSamplingType(components) {\n const types = {\n 0x11: '4:4:4 (1 1)',\n 0x12: '4:4:0 (1 2)',\n 0x14: '4:4:1 (1 4)',\n 0x21: '4:2:2 (2 1)',\n 0x22: '4:2:0 (2 2)',\n 0x24: '4:2:1 (2 4)',\n 0x41: '4:1:1 (4 1)',\n 0x42: '4:1:0 (4 2)'\n };\n\n if (components.length === 0 || components[0][1] === undefined || types[components[0][1]] === undefined) {\n return '';\n }\n\n return types[components[0][1]];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, jfifDataOffset) {\n const length = getLength(dataView, jfifDataOffset);\n const thumbnailWidth = getThumbnailWidth(dataView, jfifDataOffset, length);\n const thumbnailHeight = getThumbnailHeight(dataView, jfifDataOffset, length);\n const tags = {\n 'JFIF Version': getVersion(dataView, jfifDataOffset, length),\n 'Resolution Unit': getResolutionUnit(dataView, jfifDataOffset, length),\n 'XResolution': getXResolution(dataView, jfifDataOffset, length),\n 'YResolution': getYResolution(dataView, jfifDataOffset, length),\n 'JFIF Thumbnail Width': thumbnailWidth,\n 'JFIF Thumbnail Height': thumbnailHeight\n };\n\n if (thumbnailWidth !== undefined && thumbnailHeight !== undefined) {\n const thumbnail = getThumbnail(dataView, jfifDataOffset, 3 * thumbnailWidth.value * thumbnailHeight.value, length);\n if (thumbnail) {\n tags['JFIF Thumbnail'] = thumbnail;\n }\n }\n\n for (const tagName in tags) {\n if (tags[tagName] === undefined) {\n delete tags[tagName];\n }\n }\n\n return tags;\n}\n\nfunction getLength(dataView, jfifDataOffset) {\n return Types.getShortAt(dataView, jfifDataOffset);\n}\n\nfunction getVersion(dataView, jfifDataOffset, length) {\n const OFFSET = 7;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const majorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n const minorVersion = Types.getByteAt(dataView, jfifDataOffset + OFFSET + 1);\n return {\n value: majorVersion * 0x100 + minorVersion,\n description: majorVersion + '.' + minorVersion\n };\n}\n\nfunction getResolutionUnit(dataView, jfifDataOffset, length) {\n const OFFSET = 9;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: getResolutionUnitDescription(value)\n };\n}\n\nfunction getResolutionUnitDescription(value) {\n if (value === 0) {\n return 'None';\n }\n if (value === 1) {\n return 'inches';\n }\n if (value === 2) {\n return 'cm';\n }\n return 'Unknown';\n}\n\nfunction getXResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 10;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getYResolution(dataView, jfifDataOffset, length) {\n const OFFSET = 12;\n const SIZE = 2;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getShortAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getThumbnailWidth(dataView, jfifDataOffset, length) {\n const OFFSET = 14;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnailHeight(dataView, jfifDataOffset, length) {\n const OFFSET = 15;\n const SIZE = 1;\n\n if (OFFSET + SIZE > length) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, jfifDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getThumbnail(dataView, jfifDataOffset, thumbnailLength, length) {\n const OFFSET = 16;\n\n if (thumbnailLength === 0 || OFFSET + thumbnailLength > length) {\n return undefined;\n }\n\n const value = dataView.buffer.slice(jfifDataOffset + OFFSET, jfifDataOffset + OFFSET + thumbnailLength);\n return {\n value,\n description: '<24-bit RGB pixel data>'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringValue} from './tag-names-utils.js';\n\nexport default {\n 'iptc': {\n 0x0100: {\n 'name': 'Model Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0105: {\n 'name': 'Destination',\n 'repeatable': true\n },\n 0x0114: {\n 'name': 'File Format',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0116: {\n 'name': 'File Format Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x011e: 'Service Identifier',\n 0x0128: 'Envelope Number',\n 0x0132: 'Product ID',\n 0x013c: 'Envelope Priority',\n 0x0146: {\n 'name': 'Date Sent',\n 'description': getCreationDate\n },\n 0x0150: {\n 'name': 'Time Sent',\n 'description': getCreationTime\n },\n 0x015a: {\n 'name': 'Coded Character Set',\n 'description': getEncodingName,\n 'encoding_name': getEncodingName,\n },\n 0x0164: 'UNO',\n 0x0178: {\n 'name': 'ARM Identifier',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x017a: {\n 'name': 'ARM Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0200: {\n 'name': 'Record Version',\n 'description': (value) => {\n return ((value[0] << 8) + value[1]).toString();\n }\n },\n 0x0203: 'Object Type Reference',\n 0x0204: 'Object Attribute Reference',\n 0x0205: 'Object Name',\n 0x0207: 'Edit Status',\n 0x0208: {\n 'name': 'Editorial Update',\n 'description': (value) => {\n if (getStringValue(value) === '01') {\n return 'Additional Language';\n }\n return 'Unknown';\n }\n },\n 0x020a: 'Urgency',\n 0x020c: {\n 'name': 'Subject Reference',\n 'repeatable': true,\n 'description': (value) => {\n const parts = getStringValue(value).split(':');\n return parts[2] + (parts[3] ? '/' + parts[3] : '') + (parts[4] ? '/' + parts[4] : '');\n }\n },\n 0x020f: 'Category',\n 0x0214: {\n 'name': 'Supplemental Category',\n 'repeatable': true\n },\n 0x0216: 'Fixture Identifier',\n 0x0219: {\n 'name': 'Keywords',\n 'repeatable': true\n },\n 0x021a: {\n 'name': 'Content Location Code',\n 'repeatable': true\n },\n 0x021b: {\n 'name': 'Content Location Name',\n 'repeatable': true\n },\n 0x021e: 'Release Date',\n 0x0223: 'Release Time',\n 0x0225: 'Expiration Date',\n 0x0226: 'Expiration Time',\n 0x0228: 'Special Instructions',\n 0x022a: {\n 'name': 'Action Advised',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === '01') {\n return 'Object Kill';\n } else if (string === '02') {\n return 'Object Replace';\n } else if (string === '03') {\n return 'Object Append';\n } else if (string === '04') {\n return 'Object Reference';\n }\n return 'Unknown';\n }\n },\n 0x022d: {\n 'name': 'Reference Service',\n 'repeatable': true\n },\n 0x022f: {\n 'name': 'Reference Date',\n 'repeatable': true\n },\n 0x0232: {\n 'name': 'Reference Number',\n 'repeatable': true\n },\n 0x0237: {\n 'name': 'Date Created',\n 'description': getCreationDate\n },\n 0x023c: {\n 'name': 'Time Created',\n 'description': getCreationTime\n },\n 0x023e: {\n 'name': 'Digital Creation Date',\n 'description': getCreationDate\n },\n 0x023f: {\n 'name': 'Digital Creation Time',\n 'description': getCreationTime\n },\n 0x0241: 'Originating Program',\n 0x0246: 'Program Version',\n 0x024b: {\n 'name': 'Object Cycle',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'a') {\n return 'morning';\n } else if (string === 'p') {\n return 'evening';\n } else if (string === 'b') {\n return 'both';\n }\n return 'Unknown';\n }\n },\n 0x0250: {\n 'name': 'By-line',\n 'repeatable': true\n },\n 0x0255: {\n 'name': 'By-line Title',\n 'repeatable': true\n },\n 0x025a: 'City',\n 0x025c: 'Sub-location',\n 0x025f: 'Province/State',\n 0x0264: 'Country/Primary Location Code',\n 0x0265: 'Country/Primary Location Name',\n 0x0267: 'Original Transmission Reference',\n 0x0269: 'Headline',\n 0x026e: 'Credit',\n 0x0273: 'Source',\n 0x0274: 'Copyright Notice',\n 0x0276: {\n 'name': 'Contact',\n 'repeatable': true\n },\n 0x0278: 'Caption/Abstract',\n 0x027a: {\n 'name': 'Writer/Editor',\n 'repeatable': true\n },\n 0x027d: {\n 'name': 'Rasterized Caption',\n 'description': (value) => value\n },\n 0x0282: 'Image Type',\n 0x0283: {\n 'name': 'Image Orientation',\n 'description': (value) => {\n const string = getStringValue(value);\n if (string === 'P') {\n return 'Portrait';\n } else if (string === 'L') {\n return 'Landscape';\n } else if (string === 'S') {\n return 'Square';\n }\n return 'Unknown';\n }\n },\n 0x0287: 'Language Identifier',\n 0x0296: {\n 'name': 'Audio Type',\n 'description': (value) => {\n const stringValue = getStringValue(value);\n const character0 = stringValue.charAt(0);\n const character1 = stringValue.charAt(1);\n let description = '';\n\n if (character0 === '1') {\n description += 'Mono';\n } else if (character0 === '2') {\n description += 'Stereo';\n }\n\n if (character1 === 'A') {\n description += ', actuality';\n } else if (character1 === 'C') {\n description += ', question and answer session';\n } else if (character1 === 'M') {\n description += ', music, transmitted by itself';\n } else if (character1 === 'Q') {\n description += ', response to a question';\n } else if (character1 === 'R') {\n description += ', raw sound';\n } else if (character1 === 'S') {\n description += ', scener';\n } else if (character1 === 'V') {\n description += ', voicer';\n } else if (character1 === 'W') {\n description += ', wrap';\n }\n\n if (description !== '') {\n return description;\n }\n return stringValue;\n }\n },\n 0x0297: {\n 'name': 'Audio Sampling Rate',\n 'description': (value) => parseInt(getStringValue(value), 10) + ' Hz'\n },\n 0x0298: {\n 'name': 'Audio Sampling Resolution',\n 'description': (value) => {\n const bits = parseInt(getStringValue(value), 10);\n return bits + (bits === 1 ? ' bit' : ' bits');\n }\n },\n 0x0299: {\n 'name': 'Audio Duration',\n 'description': (value) => {\n const duration = getStringValue(value);\n if (duration.length >= 6) {\n return duration.substr(0, 2) + ':' + duration.substr(2, 2) + ':' + duration.substr(4, 2);\n }\n return duration;\n }\n },\n 0x029a: 'Audio Outcue',\n 0x02ba: 'Short Document ID',\n 0x02bb: 'Unique Document ID',\n 0x02bc: 'Owner ID',\n 0x02c8: {\n 'name': (value) => {\n if (value.length === 2) {\n return 'ObjectData Preview File Format';\n }\n return 'Record 2 destination';\n },\n 'description': (value) => {\n if (value.length === 2) {\n const intValue = (value[0] << 8) + value[1];\n if (intValue === 0) {\n return 'No ObjectData';\n } else if (intValue === 1) {\n return 'IPTC-NAA Digital Newsphoto Parameter Record';\n } else if (intValue === 2) {\n return 'IPTC7901 Recommended Message Format';\n } else if (intValue === 3) {\n return 'Tagged Image File Format (Adobe/Aldus Image data)';\n } else if (intValue === 4) {\n return 'Illustrator (Adobe Graphics data)';\n } else if (intValue === 5) {\n return 'AppleSingle (Apple Computer Inc)';\n } else if (intValue === 6) {\n return 'NAA 89-3 (ANPA 1312)';\n } else if (intValue === 7) {\n return 'MacBinary II';\n } else if (intValue === 8) {\n return 'IPTC Unstructured Character Oriented File Format (UCOFF)';\n } else if (intValue === 9) {\n return 'United Press International ANPA 1312 variant';\n } else if (intValue === 10) {\n return 'United Press International Down-Load Message';\n } else if (intValue === 11) {\n return 'JPEG File Interchange (JFIF)';\n } else if (intValue === 12) {\n return 'Photo-CD Image-Pac (Eastman Kodak)';\n } else if (intValue === 13) {\n return 'Microsoft Bit Mapped Graphics File [*.BMP]';\n } else if (intValue === 14) {\n return 'Digital Audio File [*.WAV] (Microsoft & Creative Labs)';\n } else if (intValue === 15) {\n return 'Audio plus Moving Video [*.AVI] (Microsoft)';\n } else if (intValue === 16) {\n return 'PC DOS/Windows Executable Files [*.COM][*.EXE]';\n } else if (intValue === 17) {\n return 'Compressed Binary File [*.ZIP] (PKWare Inc)';\n } else if (intValue === 18) {\n return 'Audio Interchange File Format AIFF (Apple Computer Inc)';\n } else if (intValue === 19) {\n return 'RIFF Wave (Microsoft Corporation)';\n } else if (intValue === 20) {\n return 'Freehand (Macromedia/Aldus)';\n } else if (intValue === 21) {\n return 'Hypertext Markup Language \"HTML\" (The Internet Society)';\n } else if (intValue === 22) {\n return 'MPEG 2 Audio Layer 2 (Musicom), ISO/IEC';\n } else if (intValue === 23) {\n return 'MPEG 2 Audio Layer 3, ISO/IEC';\n } else if (intValue === 24) {\n return 'Portable Document File (*.PDF) Adobe';\n } else if (intValue === 25) {\n return 'News Industry Text Format (NITF)';\n } else if (intValue === 26) {\n return 'Tape Archive (*.TAR)';\n } else if (intValue === 27) {\n return 'Tidningarnas Telegrambyrå NITF version (TTNITF DTD)';\n } else if (intValue === 28) {\n return 'Ritzaus Bureau NITF version (RBNITF DTD)';\n } else if (intValue === 29) {\n return 'Corel Draw [*.CDR]';\n }\n return `Unknown format ${intValue}`;\n }\n return getStringValue(value);\n }\n },\n 0x02c9: {\n 'name': 'ObjectData Preview File Format Version',\n 'description': (value, tags) => {\n // Format ID, Version ID, Version Description\n const formatVersions = {\n '00': {'00': '1'},\n '01': {'01': '1', '02': '2', '03': '3', '04': '4'},\n '02': {'04': '4'},\n '03': {'01': '5.0', '02': '6.0'},\n '04': {'01': '1.40'},\n '05': {'01': '2'},\n '06': {'01': '1'},\n '11': {'01': '1.02'},\n '20': {'01': '3.1', '02': '4.0', '03': '5.0', '04': '5.5'},\n '21': {'02': '2.0'}\n };\n const stringValue = getStringValue(value);\n\n if (tags['ObjectData Preview File Format']) {\n const objectDataPreviewFileFormat = getStringValue(tags['ObjectData Preview File Format'].value);\n if (formatVersions[objectDataPreviewFileFormat]\n && formatVersions[objectDataPreviewFileFormat][stringValue]) {\n return formatVersions[objectDataPreviewFileFormat][stringValue];\n }\n }\n\n return stringValue;\n }\n },\n 0x02ca: 'ObjectData Preview Data',\n 0x070a: {\n 'name': 'Size Mode',\n 'description': (value) => {\n return (value[0]).toString();\n }\n },\n 0x0714: {\n 'name': 'Max Subfile Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075a: {\n 'name': 'ObjectData Size Announced',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n },\n 0x075f: {\n 'name': 'Maximum ObjectData Size',\n 'description': (value) => {\n let n = 0;\n for (let i = 0; i < value.length; i++) {\n n = (n << 8) + value[i];\n }\n return n.toString();\n }\n }\n }\n};\n\nfunction getCreationDate(value) {\n const date = getStringValue(value);\n\n if (date.length >= 8) {\n return date.substr(0, 4) + '-' + date.substr(4, 2) + '-' + date.substr(6, 2);\n }\n\n return date;\n}\n\nfunction getCreationTime(value) {\n const time = getStringValue(value);\n let parsedTime = time;\n\n if (time.length >= 6) {\n parsedTime = time.substr(0, 2) + ':' + time.substr(2, 2) + ':' + time.substr(4, 2);\n if (time.length === 11) {\n parsedTime += time.substr(6, 1) + time.substr(7, 2) + ':' + time.substr(9, 2);\n }\n }\n\n return parsedTime;\n}\n\nfunction getEncodingName(value) {\n const string = getStringValue(value);\n if (string === '\\x1b%G') {\n return 'UTF-8';\n } else if (string === '\\x1b%5') {\n return 'Windows-1252';\n } else if (string === '\\x1b%/G') {\n return 'UTF-8 Level 1';\n } else if (string === '\\x1b%/H') {\n return 'UTF-8 Level 2';\n } else if (string === '\\x1b%/I') {\n return 'UTF-8 Level 3';\n } else if (string === '\\x1B/A') {\n return 'ISO-8859-1';\n } else if (string === '\\x1B/B') {\n return 'ISO-8859-2';\n } else if (string === '\\x1B/C') {\n return 'ISO-8859-3';\n } else if (string === '\\x1B/D') {\n return 'ISO-8859-4';\n } else if (string === '\\x1B/@') {\n return 'ISO-8859-5';\n } else if (string === '\\x1B/G') {\n return 'ISO-8859-6';\n } else if (string === '\\x1B/F') {\n return 'ISO-8859-7';\n } else if (string === '\\x1B/H') {\n return 'ISO-8859-8';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof TextDecoder !== 'undefined') {\n return TextDecoder;\n }\n\n return undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TextDecoder from './text-decoder.js';\n\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n decode,\n TAG_HEADER_SIZE\n};\n\nfunction decode(encoding, tagValue) {\n const Decoder = TextDecoder.get();\n if ((typeof Decoder !== 'undefined') && (encoding !== undefined)) {\n try {\n return new Decoder(encoding).decode(tagValue instanceof DataView ? tagValue.buffer : Uint8Array.from(tagValue));\n } catch (error) {\n // Pass through and fall back to ASCII decoding.\n }\n }\n\n const stringValue = tagValue.map((charCode) => String.fromCharCode(charCode)).join('');\n return decodeAsciiValue(stringValue);\n}\n\nfunction decodeAsciiValue(asciiValue) {\n try {\n return decodeURIComponent(escape(asciiValue));\n } catch (error) {\n return asciiValue;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport IptcTagNames from './iptc-tag-names.js';\nimport TagDecoder from './tag-decoder.js';\n\nconst BYTES_8BIM = 0x3842494d;\nconst BYTES_8BIM_SIZE = 4;\nconst RESOURCE_ID_SIZE = 2;\nconst RESOURCE_NAME_SIZE_SIZE = 1;\nconst RESOURCE_NAME_MIN_SIZE = 2;\nconst RESOURCE_SIZE_SIZE = 4;\nconst RESOURCE_BLOCK_MIN_HEADER_SIZE = BYTES_8BIM_SIZE + RESOURCE_ID_SIZE + RESOURCE_NAME_MIN_SIZE + RESOURCE_SIZE_SIZE;\nconst NAA_RESOURCE_BLOCK_TYPE = 0x0404; // Sometimes called resource ID.\nconst TAG_HEADER_SIZE = 5;\n\nexport default {\n read\n};\n\nfunction read(dataView, dataOffset, includeUnknown) {\n try {\n if (Array.isArray(dataView)) {\n return parseTags(new DataView(Uint8Array.from(dataView).buffer), {size: dataView.length}, 0, includeUnknown);\n }\n const {naaBlock, dataOffset: newDataOffset} = getNaaResourceBlock(dataView, dataOffset);\n return parseTags(dataView, naaBlock, newDataOffset, includeUnknown);\n } catch (error) {\n return {};\n }\n}\n\nfunction getNaaResourceBlock(dataView, dataOffset) {\n while (dataOffset + RESOURCE_BLOCK_MIN_HEADER_SIZE <= dataView.byteLength) {\n const resourceBlock = getResourceBlock(dataView, dataOffset);\n if (isNaaResourceBlock(resourceBlock)) {\n return {naaBlock: resourceBlock, dataOffset: dataOffset + resourceBlock.headerSize};\n }\n dataOffset += resourceBlock.headerSize + resourceBlock.size + getBlockPadding(resourceBlock);\n }\n throw new Error('No IPTC NAA resource block.');\n}\n\nfunction getResourceBlock(dataView, dataOffset) {\n if (dataView.getUint32(dataOffset, false) !== BYTES_8BIM) {\n throw new Error('Not an IPTC resource block.');\n }\n\n // We currently do not use the resource name for anything, we just need to know the size.\n const resourceNameSize = dataView.getUint8(dataOffset + BYTES_8BIM_SIZE + RESOURCE_ID_SIZE);\n const resourceNameTotalSize = (resourceNameSize % 2 === 0 ? resourceNameSize + 1 : resourceNameSize) + RESOURCE_NAME_SIZE_SIZE;\n\n return {\n headerSize: BYTES_8BIM_SIZE + RESOURCE_ID_SIZE + resourceNameTotalSize + RESOURCE_SIZE_SIZE,\n type: dataView.getUint16(dataOffset + BYTES_8BIM_SIZE),\n size: dataView.getUint32(dataOffset + BYTES_8BIM_SIZE + RESOURCE_ID_SIZE + resourceNameTotalSize),\n };\n}\n\nfunction isNaaResourceBlock(resourceBlock) {\n return resourceBlock.type === NAA_RESOURCE_BLOCK_TYPE;\n}\n\nfunction getBlockPadding(resourceBlock) {\n if (resourceBlock.size % 2 !== 0) {\n return 1;\n }\n return 0;\n}\n\nfunction parseTags(dataView, naaBlock, dataOffset, includeUnknown) {\n const tags = {};\n let encoding = undefined;\n\n const endOfBlockOffset = dataOffset + naaBlock['size'];\n\n while ((dataOffset < endOfBlockOffset) && (dataOffset < dataView.byteLength)) {\n const {tag, tagSize} = readTag(dataView, dataOffset, tags, encoding, includeUnknown);\n\n if (tag === null) {\n break;\n }\n\n if (tag) {\n if ('encoding' in tag) {\n encoding = tag.encoding;\n }\n\n if ((tags[tag.name] === undefined) || (tag['repeatable'] === undefined)) {\n tags[tag.name] = {\n id: tag.id,\n value: tag.value,\n description: tag.description\n };\n } else {\n if (!(tags[tag.name] instanceof Array)) {\n tags[tag.name] = [{\n id: tags[tag.name].id,\n value: tags[tag.name].value,\n description: tags[tag.name].description\n }];\n }\n tags[tag.name].push({\n id: tag.id,\n value: tag.value,\n description: tag.description\n });\n }\n }\n\n dataOffset += TAG_HEADER_SIZE + tagSize;\n }\n\n return tags;\n}\n\nfunction readTag(dataView, dataOffset, tags, encoding, includeUnknown) {\n const TAG_CODE_OFFSET = 1;\n const TAG_SIZE_OFFSET = 3;\n\n if (leadByteIsMissing(dataView, dataOffset)) {\n return {tag: null, tagSize: 0};\n }\n\n const tagCode = dataView.getUint16(dataOffset + TAG_CODE_OFFSET);\n const tagSize = dataView.getUint16(dataOffset + TAG_SIZE_OFFSET);\n\n if (!includeUnknown && !IptcTagNames['iptc'][tagCode]) {\n return {tag: undefined, tagSize};\n }\n\n const tagValue = getTagValue(dataView, dataOffset + TAG_HEADER_SIZE, tagSize);\n\n const tag = {\n id: tagCode,\n name: getTagName(IptcTagNames['iptc'][tagCode], tagCode, tagValue),\n value: tagValue,\n description: getTagDescription(IptcTagNames['iptc'][tagCode], tagValue, tags, encoding)\n };\n if (tagIsRepeatable(tagCode)) {\n tag['repeatable'] = true;\n }\n if (tagContainsEncoding(tagCode)) {\n tag['encoding'] = IptcTagNames['iptc'][tagCode]['encoding_name'](tagValue);\n }\n\n return {tag, tagSize};\n}\n\nfunction leadByteIsMissing(dataView, dataOffset) {\n const TAG_LEAD_BYTE = 0x1c;\n return dataView.getUint8(dataOffset) !== TAG_LEAD_BYTE;\n}\n\nfunction getTagValue(dataView, offset, size) {\n const value = [];\n\n for (let valueIndex = 0; valueIndex < size; valueIndex++) {\n value.push(dataView.getUint8(offset + valueIndex));\n }\n\n return value;\n}\n\nfunction getTagName(tag, tagCode, tagValue) {\n if (!tag) {\n return `undefined-${tagCode}`;\n }\n if (tagIsName(tag)) {\n return tag;\n }\n if (hasDynamicName(tag)) {\n return tag['name'](tagValue);\n }\n return tag['name'];\n}\n\nfunction tagIsName(tag) {\n return typeof tag === 'string';\n}\n\nfunction hasDynamicName(tag) {\n return typeof (tag['name']) === 'function';\n}\n\nfunction getTagDescription(tag, tagValue, tags, encoding) {\n if (hasDescriptionProperty(tag)) {\n try {\n return tag['description'](tagValue, tags);\n } catch (error) {\n // Fall through to next handler.\n }\n }\n if (tagValueIsText(tag, tagValue)) {\n return TagDecoder.decode(encoding, tagValue);\n }\n return tagValue;\n}\n\nfunction tagValueIsText(tag, tagValue) {\n return tag && tagValue instanceof Array;\n}\n\nfunction hasDescriptionProperty(tag) {\n return tag && tag['description'] !== undefined;\n}\n\nfunction tagIsRepeatable(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['repeatable'];\n}\n\nfunction tagContainsEncoding(tagCode) {\n return IptcTagNames['iptc'][tagCode] && IptcTagNames['iptc'][tagCode]['encoding_name'] !== undefined;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport TagNamesCommon from './tag-names-common.js';\n\nexport default {\n 'tiff:Orientation'(value) {\n if (value === '1') {\n return 'Horizontal (normal)';\n }\n if (value === '2') {\n return 'Mirror horizontal';\n }\n if (value === '3') {\n return 'Rotate 180';\n }\n if (value === '4') {\n return 'Mirror vertical';\n }\n if (value === '5') {\n return 'Mirror horizontal and rotate 270 CW';\n }\n if (value === '6') {\n return 'Rotate 90 CW';\n }\n if (value === '7') {\n return 'Mirror horizontal and rotate 90 CW';\n }\n if (value === '8') {\n return 'Rotate 270 CW';\n }\n return value;\n },\n 'tiff:ResolutionUnit': (value) => TagNamesCommon.ResolutionUnit(parseInt(value, 10)),\n 'tiff:XResolution': (value) => fraction(TagNamesCommon.XResolution, value),\n 'tiff:YResolution': (value) => fraction(TagNamesCommon.YResolution, value),\n 'exif:ApertureValue': (value) => fraction(TagNamesCommon.ApertureValue, value),\n 'exif:GPSLatitude': calculateGPSValue,\n 'exif:GPSLongitude': calculateGPSValue,\n 'exif:FNumber': (value) => fraction(TagNamesCommon.FNumber, value),\n 'exif:FocalLength': (value) => fraction(TagNamesCommon.FocalLength, value),\n 'exif:FocalPlaneResolutionUnit': (value) => TagNamesCommon.FocalPlaneResolutionUnit(parseInt(value, 10)),\n 'exif:ColorSpace': (value) => TagNamesCommon.ColorSpace(parseNumber(value)),\n 'exif:ComponentsConfiguration'(value, description) {\n if (/^\\d, \\d, \\d, \\d$/.test(description)) {\n const numbers = description.split(', ').map((number) => number.charCodeAt(0));\n return TagNamesCommon.ComponentsConfiguration(numbers);\n }\n return description;\n },\n 'exif:Contrast': (value) => TagNamesCommon.Contrast(parseInt(value, 10)),\n 'exif:CustomRendered': (value) => TagNamesCommon.CustomRendered(parseInt(value, 10)),\n 'exif:ExposureMode': (value) => TagNamesCommon.ExposureMode(parseInt(value, 10)),\n 'exif:ExposureProgram': (value) => TagNamesCommon.ExposureProgram(parseInt(value, 10)),\n 'exif:ExposureTime'(value) {\n if (isFraction(value)) {\n return TagNamesCommon.ExposureTime(value.split('/').map((number) => parseInt(number, 10)));\n }\n return value;\n },\n 'exif:MeteringMode': (value) => TagNamesCommon.MeteringMode(parseInt(value, 10)),\n 'exif:Saturation': (value) => TagNamesCommon.Saturation(parseInt(value, 10)),\n 'exif:SceneCaptureType': (value) => TagNamesCommon.SceneCaptureType(parseInt(value, 10)),\n 'exif:Sharpness': (value) => TagNamesCommon.Sharpness(parseInt(value, 10)),\n 'exif:ShutterSpeedValue': (value) => fraction(TagNamesCommon.ShutterSpeedValue, value),\n 'exif:WhiteBalance': (value) => TagNamesCommon.WhiteBalance(parseInt(value, 10))\n};\n\nfunction fraction(func, value) {\n if (isFraction(value)) {\n return func(value.split('/'));\n }\n return value;\n}\n\nfunction parseNumber(value) {\n if (value.substring(0, 2) === '0x') {\n return parseInt(value.substring(2), 16);\n }\n return parseInt(value, 10);\n}\n\nfunction isFraction(value) {\n return /^-?\\d+\\/-?\\d+$/.test(value);\n}\n\nfunction calculateGPSValue(value) {\n const [degreesString, minutesString] = value.split(',');\n if ((degreesString !== undefined) && (minutesString !== undefined)) {\n const degrees = parseFloat(degreesString);\n const minutes = parseFloat(minutesString);\n const ref = minutesString.charAt(minutesString.length - 1);\n if ((!Number.isNaN(degrees)) && (!Number.isNaN(minutes))) {\n return '' + (degrees + minutes / 60) + ref;\n }\n }\n return value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nexport default {\n get\n};\n\nfunction get() {\n if (typeof DOMParser !== 'undefined') {\n return new DOMParser();\n }\n try {\n // eslint-disable-next-line no-undef\n const {DOMParser, onErrorStopParsing} = __non_webpack_require__('@xmldom/xmldom');\n return new DOMParser({onError: onErrorStopParsing});\n } catch (error) {\n return undefined;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView, objectAssign} from './utils.js';\nimport XmpTagNames from './xmp-tag-names.js';\nimport DOMParser from './dom-parser.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunks) {\n const tags = {};\n\n if (typeof dataView === 'string') {\n readTags(tags, dataView);\n return tags;\n }\n\n const [standardXmp, extendedXmp] = extractCompleteChunks(dataView, chunks);\n\n const hasStandardTags = readTags(tags, standardXmp);\n\n if (extendedXmp) {\n const hasExtendedTags = readTags(tags, extendedXmp);\n\n if (!hasStandardTags && !hasExtendedTags) {\n // Some writers are not spec-compliant in that they split an XMP\n // metadata tree over both the standard XMP block and the extended\n // XMP block. If we failed parsing both of the XMPs in the regular\n // way, we try to combine them to see if that works better.\n delete tags._raw;\n readTags(tags, combineChunks(dataView, chunks));\n }\n }\n\n return tags;\n}\n\n// The first chunk is always the regular XMP document. Then there is something\n// called extended XMP. The extended XMP is also a single XMP document but it\n// can be divided into multiple chunks that need to be combined into one.\nfunction extractCompleteChunks(dataView, chunks) {\n if (chunks.length === 0) {\n return [];\n }\n\n const completeChunks = [combineChunks(dataView, chunks.slice(0, 1))];\n if (chunks.length > 1) {\n completeChunks.push(combineChunks(dataView, chunks.slice(1)));\n }\n\n return completeChunks;\n}\n\nfunction combineChunks(dataView, chunks) {\n const totalLength = chunks.reduce((size, chunk) => size + chunk.length, 0);\n const combinedChunks = new Uint8Array(totalLength);\n let offset = 0;\n\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n const slice = dataView.buffer.slice(chunk.dataOffset, chunk.dataOffset + chunk.length);\n combinedChunks.set(new Uint8Array(slice), offset);\n offset += chunk.length;\n }\n\n return new DataView(combinedChunks.buffer);\n}\n\nfunction readTags(tags, chunkDataView) {\n try {\n const {doc, raw} = getDocument(chunkDataView);\n tags._raw = (tags._raw || '') + raw;\n const rdf = getRDF(doc);\n\n objectAssign(tags, parseXMPObject(convertToObject(rdf, true)));\n return true;\n } catch (error) {\n return false;\n }\n}\n\nfunction getDocument(chunkDataView) {\n const domParser = DOMParser.get();\n if (!domParser) {\n console.warn('Warning: DOMParser is not available. It is needed to be able to parse XMP tags.'); // eslint-disable-line no-console\n throw new Error();\n }\n\n const xmlString = typeof chunkDataView === 'string' ? chunkDataView : getStringFromDataView(chunkDataView, 0, chunkDataView.byteLength);\n const doc = domParser.parseFromString(trimXmlSource(xmlString), 'application/xml');\n\n if (doc.documentElement.nodeName === 'parsererror') {\n throw new Error(doc.documentElement.textContent);\n }\n\n return {\n doc,\n raw: xmlString,\n };\n}\n\nfunction trimXmlSource(xmlSource) {\n return xmlSource.replace(/^.+(<\\?xpacket begin)/, '$1').replace(/(<\\?xpacket end=\".*\"\\?>).+$/, '$1');\n}\n\nfunction getRDF(node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n if (node.childNodes[i].tagName === 'x:xmpmeta') {\n return getRDF(node.childNodes[i]);\n }\n if (node.childNodes[i].tagName === 'rdf:RDF') {\n return node.childNodes[i];\n }\n }\n\n throw new Error();\n}\n\nfunction convertToObject(node, isTopNode = false) {\n const childNodes = getChildNodes(node);\n\n if (hasTextOnlyContent(childNodes)) {\n if (isTopNode) {\n return {};\n }\n return getTextValue(childNodes[0]);\n }\n\n return getElementsFromNodes(childNodes);\n}\n\nfunction getChildNodes(node) {\n const elements = [];\n\n for (let i = 0; i < node.childNodes.length; i++) {\n elements.push(node.childNodes[i]);\n }\n\n return elements;\n}\n\nfunction hasTextOnlyContent(nodes) {\n return (nodes.length === 1) && (nodes[0].nodeName === '#text');\n}\n\nfunction getTextValue(node) {\n return node.nodeValue;\n}\n\nfunction getElementsFromNodes(nodes) {\n const elements = {};\n\n nodes.forEach((node) => {\n if (isElement(node)) {\n const nodeElement = getElementFromNode(node);\n\n if (elements[node.nodeName] !== undefined) {\n if (!Array.isArray(elements[node.nodeName])) {\n elements[node.nodeName] = [elements[node.nodeName]];\n }\n elements[node.nodeName].push(nodeElement);\n } else {\n elements[node.nodeName] = nodeElement;\n }\n }\n });\n\n return elements;\n}\n\nfunction isElement(node) {\n return (node.nodeName) && (node.nodeName !== '#text');\n}\n\nfunction getElementFromNode(node) {\n return {\n attributes: getAttributes(node),\n value: convertToObject(node)\n };\n}\n\nfunction getAttributes(element) {\n const attributes = {};\n\n for (let i = 0; i < element.attributes.length; i++) {\n attributes[element.attributes[i].nodeName] = decodeURIComponent(escape(element.attributes[i].value));\n }\n\n return attributes;\n}\n\nfunction parseXMPObject(xmpObject) {\n const tags = {};\n\n if (typeof xmpObject === 'string') {\n return xmpObject;\n }\n\n for (const nodeName in xmpObject) {\n let nodes = xmpObject[nodeName];\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n nodes.forEach((node) => {\n objectAssign(tags, parseNodeAttributesAsTags(node.attributes));\n if (typeof node.value === 'object') {\n objectAssign(tags, parseNodeChildrenAsTags(node.value));\n }\n });\n }\n\n return tags;\n}\n\nfunction parseNodeAttributesAsTags(attributes) {\n const tags = {};\n\n for (const name in attributes) {\n try {\n if (isTagAttribute(name)) {\n tags[getLocalName(name)] = {\n value: attributes[name],\n attributes: {},\n description: getDescription(attributes[name], name)\n };\n }\n } catch (error) {\n // Keep going and try to parse the rest of the tags.\n }\n }\n\n return tags;\n}\n\nfunction isTagAttribute(name) {\n return (name !== 'rdf:parseType') && (!isNamespaceDefinition(name));\n}\n\nfunction isNamespaceDefinition(name) {\n return name.split(':')[0] === 'xmlns';\n}\n\nfunction getLocalName(name) {\n if (/^MicrosoftPhoto(_\\d+_)?:Rating$/i.test(name)) {\n return 'RatingPercent';\n }\n return name.split(':')[1];\n}\n\nfunction getDescription(value, name = undefined) {\n if (Array.isArray(value)) {\n const arrayDescription = getDescriptionOfArray(value);\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value, arrayDescription);\n }\n return arrayDescription;\n }\n if (typeof value === 'object') {\n return getDescriptionOfObject(value);\n }\n\n try {\n if ((name) && (typeof XmpTagNames[name] === 'function')) {\n return XmpTagNames[name](value);\n }\n return decodeURIComponent(escape(value));\n } catch (error) {\n return value;\n }\n}\n\nfunction getDescriptionOfArray(value) {\n return value.map((item) => {\n if (item.value !== undefined) {\n return getDescription(item.value);\n }\n return getDescription(item);\n }).join(', ');\n}\n\nfunction getDescriptionOfObject(value) {\n const descriptions = [];\n\n for (const key in value) {\n descriptions.push(`${getClearTextKey(key)}: ${getDescription(value[key].value)}`);\n }\n\n return descriptions.join('; ');\n}\n\nfunction getClearTextKey(key) {\n if (key === 'CiAdrCity') {\n return 'CreatorCity';\n }\n if (key === 'CiAdrCtry') {\n return 'CreatorCountry';\n }\n if (key === 'CiAdrExtadr') {\n return 'CreatorAddress';\n }\n if (key === 'CiAdrPcode') {\n return 'CreatorPostalCode';\n }\n if (key === 'CiAdrRegion') {\n return 'CreatorRegion';\n }\n if (key === 'CiEmailWork') {\n return 'CreatorWorkEmail';\n }\n if (key === 'CiTelWork') {\n return 'CreatorWorkPhone';\n }\n if (key === 'CiUrlWork') {\n return 'CreatorWorkUrl';\n }\n return key;\n}\n\nfunction parseNodeChildrenAsTags(children) {\n const tags = {};\n\n for (const name in children) {\n try {\n if (!isNamespaceDefinition(name)) {\n tags[getLocalName(name)] = parseNodeAsTag(children[name], name);\n }\n } catch (error) {\n // Keep going and try to parse the rest of the tags.\n }\n }\n\n return tags;\n}\n\nfunction parseNodeAsTag(node, name) {\n if (isDuplicateTag(node)) {\n return parseNodeAsDuplicateTag(node, name);\n }\n if (isEmptyResourceTag(node)) {\n return {value: '', attributes: {}, description: ''};\n }\n if (hasNestedSimpleRdfDescription(node)) {\n return parseNodeAsSimpleRdfDescription(node, name);\n }\n if (hasNestedStructureRdfDescription(node)) {\n return parseNodeAsStructureRdfDescription(node, name);\n }\n if (isCompactStructure(node)) {\n return parseNodeAsCompactStructure(node, name);\n }\n if (isArray(node)) {\n return parseNodeAsArray(node, name);\n }\n return parseNodeAsSimpleValue(node, name);\n}\n\nfunction isEmptyResourceTag(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n && (typeof node.value === 'string')\n && (node.value.trim() === '');\n}\n\nfunction isDuplicateTag(node) {\n return Array.isArray(node);\n}\n\nfunction parseNodeAsDuplicateTag(node, name) {\n return parseNodeAsSimpleValue(node[node.length - 1], name);\n}\n\nfunction hasNestedSimpleRdfDescription(node) {\n return ((node.attributes['rdf:parseType'] === 'Resource') && (node.value['rdf:value'] !== undefined))\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] !== undefined));\n}\n\nfunction parseNodeAsSimpleRdfDescription(node, name) {\n const attributes = parseNodeAttributes(node);\n\n if (node.value['rdf:Description'] !== undefined) {\n node = node.value['rdf:Description'];\n }\n\n objectAssign(attributes, parseNodeAttributes(node), parseNodeChildrenAsAttributes(node));\n\n const value = parseRdfValue(node);\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseNodeAttributes(node) {\n const attributes = {};\n\n for (const name in node.attributes) {\n if ((name !== 'rdf:parseType') && (name !== 'rdf:resource') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.attributes[name];\n }\n }\n\n return attributes;\n}\n\nfunction parseNodeChildrenAsAttributes(node) {\n const attributes = {};\n\n for (const name in node.value) {\n if ((name !== 'rdf:value') && (!isNamespaceDefinition(name))) {\n attributes[getLocalName(name)] = node.value[name].value;\n }\n }\n\n return attributes;\n}\n\nfunction parseRdfValue(node) {\n return getURIValue(node.value['rdf:value']) || node.value['rdf:value'].value;\n}\n\nfunction hasNestedStructureRdfDescription(node) {\n return (node.attributes['rdf:parseType'] === 'Resource')\n || ((node.value['rdf:Description'] !== undefined) && (node.value['rdf:Description'].value['rdf:value'] === undefined));\n}\n\nfunction parseNodeAsStructureRdfDescription(node, name) {\n const tag = {\n value: {},\n attributes: {}\n };\n\n if (node.value['rdf:Description'] !== undefined) {\n objectAssign(tag.value, parseNodeAttributesAsTags(node.value['rdf:Description'].attributes));\n objectAssign(tag.attributes, parseNodeAttributes(node));\n node = node.value['rdf:Description'];\n }\n\n objectAssign(tag.value, parseNodeChildrenAsTags(node.value));\n\n tag.description = getDescription(tag.value, name);\n\n return tag;\n}\n\nfunction isCompactStructure(node) {\n return (Object.keys(node.value).length === 0)\n && (node.attributes['xml:lang'] === undefined)\n && (node.attributes['rdf:resource'] === undefined);\n}\n\nfunction parseNodeAsCompactStructure(node, name) {\n const value = parseNodeAttributesAsTags(node.attributes);\n\n return {\n value,\n attributes: {},\n description: getDescription(value, name)\n };\n}\n\nfunction isArray(node) {\n return getArrayChild(node.value) !== undefined;\n}\n\nfunction getArrayChild(value) {\n return value['rdf:Bag'] || value['rdf:Seq'] || value['rdf:Alt'];\n}\n\nfunction parseNodeAsArray(node, name) {\n let items = getArrayChild(node.value).value['rdf:li'];\n const attributes = parseNodeAttributes(node);\n const value = [];\n\n if (items === undefined) {\n items = [];\n } else if (!Array.isArray(items)) {\n items = [items];\n }\n\n items.forEach((item) => {\n value.push(parseArrayValue(item));\n });\n\n return {\n value,\n attributes,\n description: getDescription(value, name)\n };\n}\n\nfunction parseArrayValue(item) {\n if (hasNestedSimpleRdfDescription(item)) {\n return parseNodeAsSimpleRdfDescription(item);\n }\n if (hasNestedStructureRdfDescription(item)) {\n return parseNodeAsStructureRdfDescription(item).value;\n }\n if (isCompactStructure(item)) {\n return parseNodeAsCompactStructure(item).value;\n }\n\n return parseNodeAsSimpleValue(item);\n}\n\nfunction parseNodeAsSimpleValue(node, name) {\n const value = getURIValue(node) || parseXMPObject(node.value);\n\n return {\n value,\n attributes: parseNodeAttributes(node),\n description: getDescription(value, name)\n };\n}\n\nfunction getURIValue(node) {\n return node.attributes && node.attributes['rdf:resource'];\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {\n getPascalStringFromDataView,\n padStart,\n parseFloatRadix,\n strRepeat\n} from './utils.js';\n\n// export const OsTypeKeys = {\n// OBJC: 'Objc',\n// DOUB: 'doub',\n// UNTF: 'UntF',\n// TEXT: 'TEXT',\n// BOOL: 'bool',\n// ENUM: 'enum',\n// LONG: 'long'\n// };\n\nexport const PathRecordTypes = {\n CLOSED_SUBPATH_LENGTH: 0,\n CLOSED_SUBPATH_BEZIER_LINKED: 1,\n CLOSED_SUBPATH_BEZIER_UNLINKED: 2,\n OPEN_SUBPATH_LENGTH: 3,\n OPEN_SUBPATH_BEZIER_LINKED: 4,\n OPEN_SUBPATH_BEZIER_UNLINKED: 5,\n FILL_RULE: 6,\n CLIPBOARD: 7,\n INITIAL_FILL_RULE: 8\n};\n\nconst PATH_RECORD_SIZE = 24;\n\nexport default {\n // 0x0425: {\n // name: 'CaptionDigest',\n // description(dataView) {\n // let description = '';\n // for (let i = 0; i < dataView.byteLength; i++) {\n // const byte = dataView.getUint8(i);\n // description += padStart(byte.toString(16), 2, '0');\n // }\n // return description;\n // }\n // },\n // Commented out for now to lower bundle size until someone asks for it.\n // 0x043a: {\n // name: 'PrintInformation',\n // description: parseDescriptor\n // },\n // 0x043b: {\n // name: 'PrintStyle',\n // description: parseDescriptor\n // },\n 0x07d0: {\n name: 'PathInformation',\n description: pathResource\n },\n 0x0bb7: {\n name: 'ClippingPathName',\n description(dataView) {\n const [, string] = getPascalStringFromDataView(dataView, 0);\n return string;\n }\n },\n};\n\n// function parseDescriptor(dataView) {\n// const DESCRIPTOR_VERSION_SIZE = 4;\n// // This is a unicode string terminated with null. Unsure about the format though since in my example image it starts with 0x0000.\n// const UNCLEAR_CLASS_ID_NAME_PART_SIZE = 6;\n// let offset = 0;\n// offset += DESCRIPTOR_VERSION_SIZE + UNCLEAR_CLASS_ID_NAME_PART_SIZE;\n// const [classId, classIdSize] = getBlockValue(dataView, offset);\n// offset += classIdSize;\n// const numItems = Types.getLongAt(dataView, offset);\n// offset += 4;\n// const descriptor = {[classId]: {}};\n// for (let i = 0; i < numItems; i++) {\n// const [itemKey, itemKeySize] = getBlockValue(dataView, offset);\n// offset += itemKeySize;\n// const osTypeKey = getStringFromDataView(dataView, offset, 4);\n// offset += 4;\n// try {\n// const {itemValue, itemSize} = getItemValue(dataView, offset, osTypeKey);\n// offset += itemSize;\n// descriptor[classId][ITEM_KEY_TERMS[itemKey] || itemKey] = itemValue;\n// } catch (error) {\n// // We can't recover from unknown OS type key since we don't know\n// // where the next one starts.\n// break;\n// }\n// }\n// return JSON.stringify(descriptor);\n// }\n\n// function getBlockValue(dataView, offset, unicode = false) {\n// const length = (unicode ? 2 : 1) * Types.getLongAt(dataView, offset) || 4;\n// offset += 4;\n// const value = (unicode ? getUnicodeStringFromDataView : getStringFromDataView)(dataView, offset, length);\n// offset += length;\n// return [value, 4 + length];\n// }\n\n// function getItemValue(dataView, offset, osTypeKey) {\n// // Not all OSType keys are implemented yet because they are missing in the example image.\n// if (osTypeKey === OsTypeKeys.OBJC) {\n// const [classIdName, classIdNameSize] = getBlockValue(dataView, offset, true);\n// offset += classIdNameSize;\n// const [classId, classIdSize] = getBlockValue(dataView, offset);\n// offset += classIdSize;\n// const _offset = Types.getLongAt(dataView, offset);\n// return {\n// itemValue: {[classIdName]: {[classId]: _offset}},\n// itemSize: classIdNameSize + classIdSize + 4\n// };\n// }\n// if (osTypeKey === OsTypeKeys.DOUB) {\n// return {\n// itemValue: parseDouble(dataView, offset),\n// itemSize: 8\n// };\n// }\n// if (osTypeKey === OsTypeKeys.UNTF) {\n// const unit = getStringFromDataView(dataView, offset, 4);\n// return {\n// itemValue: {unit, value: parseDouble(dataView, offset + 4)},\n// itemSize: unit.length + 8\n// };\n// }\n// if (osTypeKey === OsTypeKeys.TEXT) {\n// const length = 2 * Types.getLongAt(dataView, offset);\n// offset += 4;\n// const text = getUnicodeStringFromDataView(dataView, offset, length);\n// return {\n// itemValue: text,\n// itemSize: 4 + length\n// };\n// }\n// if (osTypeKey === OsTypeKeys.BOOL) {\n// return {\n// itemValue: Types.getByteAt(dataView, offset) === 1,\n// itemSize: 1\n// };\n// }\n// if (osTypeKey === OsTypeKeys.ENUM) {\n// const [type, typeSize] = getBlockValue(dataView, offset);\n// offset += typeSize;\n// const [enumName, enumSize] = getBlockValue(dataView, offset);\n// return {\n// itemValue: {[type]: enumName},\n// itemSize: typeSize + enumSize\n// };\n// }\n// if (osTypeKey === OsTypeKeys.LONG) {\n// return {\n// itemValue: Types.getLongAt(dataView, offset),\n// itemSize: 4\n// };\n// }\n// throw new Error(`Unknown OS type key: ${osTypeKey}`);\n// }\n\n// function parseDouble(dataView, offset) {\n// const BIAS = 1023;\n// const sign = (Types.getByteAt(dataView, offset) & parseInt('10000000', 2)) === 0 ? 1 : -1;\n// const exponent = ((Types.getShortAt(dataView, offset) & parseInt('0111111111110000', 2)) >> 4) - BIAS;\n// const fractionHigh = padStart((Types.getLongAt(dataView, offset) & parseInt('00000000000011111111111111111111', 2)).toString(2), 20, '0');\n// const fractionLow = padStart(Types.getLongAt(dataView, offset + 4).toString(2), 32, '0');\n// const fraction = parseFloatRadix('1.' + fractionHigh + fractionLow, 2);\n// return sign * fraction * Math.pow(2, exponent);\n// }\n\nfunction pathResource(dataView) {\n const TYPE_SIZE = 2;\n const types = {};\n const paths = [];\n\n for (let offset = 0; offset < dataView.byteLength; offset += TYPE_SIZE + PATH_RECORD_SIZE) {\n const type = Types.getShortAt(dataView, offset);\n if (PATH_RECORD_TYPES[type]) {\n if (!types[type]) {\n types[type] = PATH_RECORD_TYPES[type].description;\n }\n paths.push({\n type,\n path: PATH_RECORD_TYPES[type].path(dataView, offset + TYPE_SIZE)\n });\n }\n }\n return JSON.stringify({types, paths});\n}\n\nconst PATH_RECORD_TYPES = {\n [PathRecordTypes.CLOSED_SUBPATH_LENGTH]: {\n description: 'Closed subpath length',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.CLOSED_SUBPATH_BEZIER_LINKED]: {\n description: 'Closed subpath Bezier knot, linked',\n path: parseBezierKnot\n },\n [PathRecordTypes.CLOSED_SUBPATH_BEZIER_UNLINKED]: {\n description: 'Closed subpath Bezier knot, unlinked',\n path: parseBezierKnot\n },\n [PathRecordTypes.OPEN_SUBPATH_LENGTH]: {\n description: 'Open subpath length',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.OPEN_SUBPATH_BEZIER_LINKED]: {\n description: 'Open subpath Bezier knot, linked',\n path: parseBezierKnot\n },\n [PathRecordTypes.OPEN_SUBPATH_BEZIER_UNLINKED]: {\n description: 'Open subpath Bezier knot, unlinked',\n path: parseBezierKnot\n },\n [PathRecordTypes.FILL_RULE]: {\n description: 'Path fill rule',\n path: () => []\n },\n [PathRecordTypes.INITIAL_FILL_RULE]: {\n description: 'Initial fill rule',\n path: (dataView, offset) => [Types.getShortAt(dataView, offset)]\n },\n [PathRecordTypes.CLIPBOARD]: {\n description: 'Clipboard',\n path: parseClipboard\n }\n};\n\nfunction parseBezierKnot(dataView, offset) {\n const PATH_POINT_SIZE = 8;\n const path = [];\n for (let i = 0; i < PATH_RECORD_SIZE; i += PATH_POINT_SIZE) {\n path.push(parsePathPoint(dataView, offset + i));\n }\n return path;\n}\n\nfunction parsePathPoint(dataView, offset) {\n const vertical = getFixedPointNumber(dataView, offset, 8);\n const horizontal = getFixedPointNumber(dataView, offset + 4, 8);\n return [horizontal, vertical];\n}\n\nfunction parseClipboard(dataView, offset) {\n return [\n [\n getFixedPointNumber(dataView, offset, 8), // Top\n getFixedPointNumber(dataView, offset + 4, 8), // Left\n getFixedPointNumber(dataView, offset + 8, 8), // Botton\n getFixedPointNumber(dataView, offset + 12, 8), // Right\n ],\n getFixedPointNumber(dataView, offset + 16, 8) // Resolution\n ];\n}\n\nfunction getFixedPointNumber(dataView, offset, binaryPoint) {\n const number = Types.getLongAt(dataView, offset);\n\n const sign = (number >>> 31) === 0 ? 1 : -1;\n const integer = (number & 0x7f000000) >>> (32 - binaryPoint);\n const fraction = number & parseInt(strRepeat('1', 32 - binaryPoint), 2);\n\n return sign * parseFloatRadix(integer.toString(2) + '.' + padStart(fraction.toString(2), 32 - binaryPoint, '0'), 2);\n}\n\n// Item key terminology: https://psd-tools.readthedocs.io/en/latest/reference/psd_tools.terminology.html\n// Are these correct? There are collisions that are commented out. A lot of code for little gain?\n// const ITEM_KEY_TERMS = {\n// 'A ': 'A',\n// 'Adjs': 'Adjustment',\n// 'Algd': 'Aligned',\n// 'Algn': 'Alignment',\n// 'AllE': 'AllExcept',\n// 'All ': 'AllPS',\n// 'AlTl': 'AllToolOptions',\n// 'AChn': 'AlphaChannelOptions',\n// 'AlpC': 'AlphaChannels',\n// 'AmbB': 'AmbientBrightness',\n// 'AmbC': 'AmbientColor',\n// 'Amnt': 'Amount',\n// 'AmMx': 'AmplitudeMax',\n// 'AmMn': 'AmplitudeMin',\n// 'Anch': 'Anchor',\n// 'Angl': 'Angle',\n// 'Ang1': 'Angle1',\n// 'Ang2': 'Angle2',\n// 'Ang3': 'Angle3',\n// 'Ang4': 'Angle4',\n// 'AntA': 'AntiAlias',\n// 'Appe': 'Append',\n// 'Aply': 'Apply',\n// 'Ar ': 'Area',\n// 'Arrw': 'Arrowhead',\n// 'As ': 'As',\n// 'Asst': 'AssetBin',\n// 'AssC': 'AssumedCMYK',\n// 'AssG': 'AssumedGray',\n// 'AssR': 'AssumedRGB',\n// 'At ': 'At',\n// 'Auto': 'Auto',\n// 'AuCo': 'AutoContrast',\n// 'Atrs': 'AutoErase',\n// 'AtKr': 'AutoKern',\n// 'AtUp': 'AutoUpdate',\n// 'Axis': 'Axis',\n// 'B ': 'B',\n// 'Bckg': 'Background',\n// 'BckC': 'BackgroundColor',\n// 'BckL': 'BackgroundLevel',\n// 'Bwd ': 'Backward',\n// 'Blnc': 'Balance',\n// 'Bsln': 'BaselineShift',\n// 'BpWh': 'BeepWhenDone',\n// 'BgnR': 'BeginRamp',\n// 'BgnS': 'BeginSustain',\n// 'bvlD': 'BevelDirection',\n// 'ebbl': 'BevelEmboss',\n// 'bvlS': 'BevelStyle',\n// 'bvlT': 'BevelTechnique',\n// 'BgNH': 'BigNudgeH',\n// 'BgNV': 'BigNudgeV',\n// 'BtDp': 'BitDepth',\n// 'Blck': 'Black',\n// 'BlcC': 'BlackClip',\n// 'Blcn': 'BlackGeneration',\n// 'BlcG': 'BlackGenerationCurve',\n// 'BlcI': 'BlackIntensity',\n// 'BlcL': 'BlackLevel',\n// // 'BlcL': 'BlackLimit',\n// 'Bld ': 'Bleed',\n// 'Blnd': 'BlendRange',\n// 'Bl ': 'Blue',\n// 'BlBl': 'BlueBlackPoint',\n// 'blueFloat': 'BlueFloat',\n// 'BlGm': 'BlueGamma',\n// 'BlWh': 'BlueWhitePoint',\n// 'BlX ': 'BlueX',\n// 'BlY ': 'BlueY',\n// 'blur': 'Blur',\n// 'BlrM': 'BlurMethod',\n// 'BlrQ': 'BlurQuality',\n// 'Bk ': 'Book',\n// 'BrdT': 'BorderThickness',\n// 'Btom': 'Bottom',\n// 'Brgh': 'Brightness',\n// 'BrsD': 'BrushDetail',\n// 'BrsS': 'BrushSize',\n// 'BrsT': 'BrushType',\n// 'Brsh': 'Brushes',\n// 'BmpA': 'BumpAmplitude',\n// 'BmpC': 'BumpChannel',\n// 'By ': 'By',\n// 'Byln': 'Byline',\n// 'BylT': 'BylineTitle',\n// 'BytO': 'ByteOrder',\n// 'CMYS': 'CMYKSetup',\n// 'CchP': 'CachePrefs',\n// 'Clcl': 'Calculation',\n// 'Clbr': 'CalibrationBars',\n// 'Cptn': 'Caption',\n// 'CptW': 'CaptionWriter',\n// 'Ctgr': 'Category',\n// 'ClSz': 'CellSize',\n// 'Cntr': 'Center',\n// 'CntC': 'CenterCropMarks',\n// 'ChlA': 'ChalkArea',\n// 'Chnl': 'Channel',\n// 'ChMx': 'ChannelMatrix',\n// 'ChnN': 'ChannelName',\n// 'Chns': 'Channels',\n// 'ChnI': 'ChannelsInterleaved',\n// 'ChAm': 'CharcoalAmount',\n// 'ChrA': 'CharcoalArea',\n// 'Ckmt': 'ChokeMatte',\n// 'ChFX': 'ChromeFX',\n// 'City': 'City',\n// 'ClrA': 'ClearAmount',\n// 'ClPt': 'ClippingPath',\n// 'ClpP': 'ClippingPathEPS',\n// 'ClpF': 'ClippingPathFlatness',\n// 'ClpI': 'ClippingPathIndex',\n// 'Clpg': 'ClippingPathInfo',\n// 'ClnS': 'CloneSource',\n// 'Clsp': 'ClosedSubpath',\n// 'Clr ': 'Color',\n// 'Clrh': 'ColorChannels',\n// 'ClrC': 'ColorCorrection',\n// 'ClrI': 'ColorIndicates',\n// 'ClMg': 'ColorManagement',\n// 'Clrr': 'ColorPickerPrefs',\n// 'ClrS': 'ColorSpace',\n// 'ClrT': 'ColorTable',\n// 'Clrz': 'Colorize',\n// 'Clrs': 'Colors',\n// 'ClrL': 'ColorsList',\n// 'ClmW': 'ColumnWidth',\n// 'CmdK': 'CommandKey',\n// 'Cmpn': 'Compensation',\n// 'Cmpr': 'Compression',\n// 'Cncv': 'Concavity',\n// 'Cndt': 'Condition',\n// 'Cnst': 'Constant',\n// // 'Cnst': 'Constrain',\n// 'CnsP': 'ConstrainProportions',\n// 'Cfov': 'ConstructionFOV',\n// 'Cntg': 'Contiguous',\n// 'Cntn': 'Continue',\n// 'Cnty': 'Continuity',\n// 'ShpC': 'ContourType',\n// // 'Cntr': 'Contrast',\n// 'Cnvr': 'Convert',\n// 'Cpy ': 'Copy',\n// 'Cpyr': 'Copyright',\n// 'CprN': 'CopyrightNotice',\n// 'CrnC': 'CornerCropMarks',\n// 'Cnt ': 'Count',\n// 'CntN': 'CountryName',\n// 'CrcB': 'CrackBrightness',\n// 'CrcD': 'CrackDepth',\n// 'CrcS': 'CrackSpacing',\n// 'blfl': 'CreateLayersFromLayerFX',\n// 'Crdt': 'Credit',\n// 'Crss': 'Crossover',\n// 'Crnt': 'Current',\n// 'CrnH': 'CurrentHistoryState',\n// 'CrnL': 'CurrentLight',\n// 'CrnT': 'CurrentToolOptions',\n// 'Crv ': 'Curve',\n// 'CrvF': 'CurveFile',\n// 'Cstm': 'Custom',\n// 'CstF': 'CustomForced',\n// 'CstM': 'CustomMatte',\n// 'CstP': 'CustomPalette',\n// 'Cyn ': 'Cyan',\n// 'DCS ': 'DCS',\n// 'DPXf': 'DPXFormat',\n// 'DrkI': 'DarkIntensity',\n// 'Drkn': 'Darkness',\n// 'DtCr': 'DateCreated',\n// 'Dt ': 'Datum',\n// 'Dfnt': 'Definition',\n// 'Dnst': 'Density',\n// 'Dpth': 'Depth',\n// 'Dstl': 'DestBlackMax',\n// 'DstB': 'DestBlackMin',\n// 'Dstt': 'DestWhiteMax',\n// 'DstW': 'DestWhiteMin',\n// 'DstM': 'DestinationMode',\n// 'Dtl ': 'Detail',\n// 'Dmtr': 'Diameter',\n// 'DffD': 'DiffusionDither',\n// 'Drct': 'Direction',\n// 'DrcB': 'DirectionBalance',\n// 'DspF': 'DisplaceFile',\n// 'DspM': 'DisplacementMap',\n// 'DspP': 'DisplayPrefs',\n// 'Dstn': 'Distance',\n// // 'Dstr': 'Distortion',\n// // 'Dstr': 'Distribution',\n// 'Dthr': 'Dither',\n// 'DthA': 'DitherAmount',\n// 'Dthp': 'DitherPreserve',\n// 'Dthq': 'DitherQuality',\n// 'DocI': 'DocumentID',\n// 'DtGn': 'DotGain',\n// 'DtGC': 'DotGainCurves',\n// 'DrSh': 'DropShadow',\n// 'Dplc': 'Duplicate',\n// 'DnmC': 'DynamicColorSliders',\n// 'Edg ': 'Edge',\n// 'EdgB': 'EdgeBrightness',\n// 'EdgF': 'EdgeFidelity',\n// 'EdgI': 'EdgeIntensity',\n// 'EdgS': 'EdgeSimplicity',\n// 'EdgT': 'EdgeThickness',\n// 'EdgW': 'EdgeWidth',\n// 'Effc': 'Effect',\n// 'EmbC': 'EmbedCMYK',\n// 'EmbG': 'EmbedGray',\n// 'EmbL': 'EmbedLab',\n// 'EmbP': 'EmbedProfiles',\n// 'EmbR': 'EmbedRGB',\n// 'EmlD': 'EmulsionDown',\n// 'EGst': 'EnableGestures',\n// 'enab': 'Enabled',\n// 'Encd': 'Encoding',\n// 'End ': 'End',\n// 'EndA': 'EndArrowhead',\n// 'EndR': 'EndRamp',\n// 'EndS': 'EndSustain',\n// 'Engn': 'Engine',\n// 'ErsT': 'EraseToHistory',\n// 'ErsK': 'EraserKind',\n// 'ExcP': 'ExactPoints',\n// 'Expr': 'Export',\n// 'ExpC': 'ExportClipboard',\n// 'Exps': 'Exposure',\n// 'Extd': 'Extend',\n// 'EQlt': 'ExtendedQuality',\n// 'Extn': 'Extension',\n// 'ExtQ': 'ExtensionsQuery',\n// 'ExtD': 'ExtrudeDepth',\n// 'ExtM': 'ExtrudeMaskIncomplete',\n// 'ExtR': 'ExtrudeRandom',\n// 'ExtS': 'ExtrudeSize',\n// 'ExtF': 'ExtrudeSolidFace',\n// 'ExtT': 'ExtrudeType',\n// 'EyDr': 'EyeDropperSample',\n// 'FxCm': 'FPXCompress',\n// 'FxQl': 'FPXQuality',\n// 'FxSz': 'FPXSize',\n// 'FxVw': 'FPXView',\n// 'FdT ': 'FadeTo',\n// 'FdtS': 'FadeoutSteps',\n// 'FlOf': 'Falloff',\n// 'Fthr': 'Feather',\n// 'FbrL': 'FiberLength',\n// 'File': 'File',\n// 'FlCr': 'FileCreator',\n// 'FlIn': 'FileInfo',\n// 'FilR': 'FileReference',\n// 'FlSP': 'FileSavePrefs',\n// 'FlTy': 'FileType',\n// 'flst': 'FilesList',\n// 'Fl ': 'Fill',\n// 'FlCl': 'FillColor',\n// 'FlNt': 'FillNeutral',\n// 'FlPd': 'FilterLayerPersistentData',\n// 'FlRs': 'FilterLayerRandomSeed',\n// 'Fngr': 'Fingerpainting',\n// 'FlrC': 'FlareCenter',\n// 'Fltn': 'Flatness',\n// 'Fltt': 'Flatten',\n// 'FlpV': 'FlipVertical',\n// 'Fcs ': 'Focus',\n// 'Fldr': 'Folders',\n// 'FntD': 'FontDesignAxes',\n// 'FntV': 'FontDesignAxesVectors',\n// 'FntN': 'FontName',\n// 'Scrp': 'FontScript',\n// 'FntS': 'FontStyleName',\n// 'FntT': 'FontTechnology',\n// 'FrcC': 'ForcedColors',\n// 'FrgC': 'ForegroundColor',\n// 'FrgL': 'ForegroundLevel',\n// 'Fmt ': 'Format',\n// 'Fwd ': 'Forward',\n// 'FrFX': 'FrameFX',\n// 'FrmW': 'FrameWidth',\n// 'FTcs': 'FreeTransformCenterState',\n// 'Frqn': 'Frequency',\n// 'From': 'From',\n// 'FrmB': 'FromBuiltin',\n// 'FrmM': 'FromMode',\n// 'FncK': 'FunctionKey',\n// 'Fzns': 'Fuzziness',\n// 'GCR ': 'GCR',\n// 'GFPT': 'GIFColorFileType',\n// 'GFCL': 'GIFColorLimit',\n// 'GFEC': 'GIFExportCaption',\n// 'GFMI': 'GIFMaskChannelIndex',\n// 'GFMV': 'GIFMaskChannelInverted',\n// 'GFPF': 'GIFPaletteFile',\n// 'GFPL': 'GIFPaletteType',\n// 'GFCS': 'GIFRequiredColorSpaceType',\n// 'GFIT': 'GIFRowOrderType',\n// 'GFTC': 'GIFTransparentColor',\n// 'GFTB': 'GIFTransparentIndexBlue',\n// 'GFTG': 'GIFTransparentIndexGreen',\n// 'GFTR': 'GIFTransparentIndexRed',\n// 'GFBM': 'GIFUseBestMatch',\n// 'Gmm ': 'Gamma',\n// 'GmtW': 'GamutWarning',\n// 'GnrP': 'GeneralPrefs',\n// 'gblA': 'GlobalAngle',\n// 'gagl': 'GlobalLightingAngle',\n// 'Glos': 'Gloss',\n// 'GlwA': 'GlowAmount',\n// 'GlwT': 'GlowTechnique',\n// 'Grad': 'Gradient',\n// 'Grdf': 'GradientFill',\n// // 'Grn ': 'Grain',\n// 'Grnt': 'GrainType',\n// 'Grns': 'Graininess',\n// 'Gry ': 'Gray',\n// 'GrBh': 'GrayBehavior',\n// 'GrSt': 'GraySetup',\n// 'Grn ': 'Green',\n// 'GrnB': 'GreenBlackPoint',\n// 'greenFloat': 'GreenFloat',\n// 'GrnG': 'GreenGamma',\n// 'GrnW': 'GreenWhitePoint',\n// 'GrnX': 'GreenX',\n// 'GrnY': 'GreenY',\n// 'GrdC': 'GridColor',\n// 'Grds': 'GridCustomColor',\n// 'GrdM': 'GridMajor',\n// 'Grdn': 'GridMinor',\n// 'GrdS': 'GridStyle',\n// 'Grdt': 'GridUnits',\n// 'Grup': 'Group',\n// 'GrtW': 'GroutWidth',\n// 'GrwS': 'GrowSelection',\n// 'Gdes': 'Guides',\n// 'GdsC': 'GuidesColor',\n// 'Gdss': 'GuidesCustomColor',\n// 'GdPr': 'GuidesPrefs',\n// 'GdsS': 'GuidesStyle',\n// 'GttW': 'GutterWidth',\n// 'HlfF': 'HalftoneFile',\n// 'HlfS': 'HalftoneScreen',\n// 'HlSz': 'HalftoneSize',\n// 'Hlfp': 'HalftoneSpec',\n// 'Hrdn': 'Hardness',\n// 'HCdH': 'HasCmdHPreference',\n// 'Hdr ': 'Header',\n// 'Hdln': 'Headline',\n// 'Hght': 'Height',\n// 'HghA': 'HighlightArea',\n// 'hglC': 'HighlightColor',\n// 'HghL': 'HighlightLevels',\n// 'hglM': 'HighlightMode',\n// 'hglO': 'HighlightOpacity',\n// 'HghS': 'HighlightStrength',\n// 'HstB': 'HistoryBrushSource',\n// 'HstP': 'HistoryPrefs',\n// 'HsSS': 'HistoryStateSource',\n// 'HsSt': 'HistoryStates',\n// 'Hrzn': 'Horizontal',\n// 'HrzS': 'HorizontalScale',\n// 'HstN': 'HostName',\n// 'HstV': 'HostVersion',\n// 'H ': 'Hue',\n// 'ICCE': 'ICCEngine',\n// 'ICCt': 'ICCSetupName',\n// 'Idnt': 'ID',\n// 'Idle': 'Idle',\n// 'ImgB': 'ImageBalance',\n// 'Impr': 'Import',\n// 'Imps': 'Impressionist',\n// 'In ': 'In',\n// 'c@#^': 'Inherits',\n// 'InkC': 'InkColors',\n// 'Inks': 'Inks',\n// 'IrGl': 'InnerGlow',\n// 'glwS': 'InnerGlowSource',\n// 'IrSh': 'InnerShadow',\n// 'Inpt': 'Input',\n// 'kIBP': 'InputBlackPoint',\n// 'Inmr': 'InputMapRange',\n// 'Inpr': 'InputRange',\n// 'kIWP': 'InputWhitePoint',\n// 'Intn': 'Intensity',\n// 'Inte': 'Intent',\n// 'IntH': 'InterfaceBevelHighlight',\n// 'Intv': 'InterfaceBevelShadow',\n// 'IntB': 'InterfaceBlack',\n// 'Intd': 'InterfaceBorder',\n// 'Intk': 'InterfaceButtonDarkShadow',\n// 'Intt': 'InterfaceButtonDownFill',\n// 'InBF': 'InterfaceButtonUpFill',\n// 'ICBL': 'InterfaceColorBlue2',\n// 'ICBH': 'InterfaceColorBlue32',\n// 'ICGL': 'InterfaceColorGreen2',\n// 'ICGH': 'InterfaceColorGreen32',\n// 'ICRL': 'InterfaceColorRed2',\n// 'ICRH': 'InterfaceColorRed32',\n// 'IntI': 'InterfaceIconFillActive',\n// 'IntF': 'InterfaceIconFillDimmed',\n// 'Intc': 'InterfaceIconFillSelected',\n// 'Intm': 'InterfaceIconFrameActive',\n// // 'Intr': 'InterfaceIconFrameDimmed',\n// 'IntS': 'InterfaceIconFrameSelected',\n// 'IntP': 'InterfacePaletteFill',\n// 'IntR': 'InterfaceRed',\n// 'IntT': 'InterfaceToolTipBackground',\n// 'ITTT': 'InterfaceToolTipText',\n// 'ITBg': 'InterfaceTransparencyBackground',\n// 'ITFg': 'InterfaceTransparencyForeground',\n// 'IntW': 'InterfaceWhite',\n// // 'Intr': 'Interlace',\n// 'IntC': 'InterlaceCreateType',\n// 'IntE': 'InterlaceEliminateType',\n// // 'Intr': 'Interpolation',\n// 'IntM': 'InterpolationMethod',\n// 'Invr': 'Invert',\n// 'InvM': 'InvertMask',\n// 'InvS': 'InvertSource2',\n// 'InvT': 'InvertTexture',\n// 'IsDr': 'IsDirty',\n// 'ItmI': 'ItemIndex',\n// 'JPEQ': 'JPEGQuality',\n// 'Krng': 'Kerning',\n// 'Kywd': 'Keywords',\n// 'Knd ': 'Kind',\n// 'LTnm': 'LUTAnimation',\n// 'LZWC': 'LZWCompression',\n// 'Lbls': 'Labels',\n// 'Lnds': 'Landscape',\n// 'LstT': 'LastTransform',\n// 'Lyr ': 'Layer',\n// 'Lefx': 'LayerEffects',\n// 'lfxv': 'LayerFXVisible',\n// 'LyrI': 'LayerID',\n// 'LyrN': 'LayerName',\n// 'Lyrs': 'Layers',\n// 'Ldng': 'Leading',\n// 'Left': 'Left',\n// 'lSNs': 'LegacySerialString',\n// // 'Lngt': 'Length',\n// 'Lns ': 'Lens',\n// 'Lvl ': 'Level',\n// 'Lvls': 'Levels',\n// 'LgDr': 'LightDark',\n// 'LghD': 'LightDirection',\n// 'LghI': 'LightIntensity',\n// 'LghP': 'LightPosition',\n// 'LghS': 'LightSource',\n// 'LghT': 'LightType',\n// 'LghG': 'LightenGrout',\n// 'Lght': 'Lightness',\n// 'Line': 'Line',\n// 'lnkE': 'LinkEnable',\n// 'LnkL': 'LinkedLayerIDs',\n// 'Lald': 'LocalLightingAltitude',\n// 'lagl': 'LocalLightingAngle',\n// 'LclR': 'LocalRange',\n// 'Lctn': 'Location',\n// 'Log ': 'Log',\n// 'kLog': 'Logarithmic',\n// 'LwCs': 'LowerCase',\n// 'Lmnc': 'Luminance',\n// 'Mgnt': 'Magenta',\n// 'MkVs': 'MakeVisible',\n// 'Mfov': 'ManipulationFOV',\n// 'MpBl': 'MapBlack',\n// 'Mpng': 'Mapping',\n// 'MpgS': 'MappingShape',\n// 'Mtrl': 'Material',\n// 'Mtrx': 'Matrix',\n// 'MttC': 'MatteColor',\n// 'Mxm ': 'Maximum',\n// 'MxmS': 'MaximumStates',\n// 'MmrU': 'MemoryUsagePercent',\n// 'Mrge': 'Merge',\n// 'Mrgd': 'Merged',\n// 'Msge': 'Message',\n// 'Mthd': 'Method',\n// 'MztT': 'MezzotintType',\n// 'Mdpn': 'Midpoint',\n// 'MdtL': 'MidtoneLevels',\n// 'Mnm ': 'Minimum',\n// 'MsmC': 'MismatchCMYK',\n// 'MsmG': 'MismatchGray',\n// 'MsmR': 'MismatchRGB',\n// 'Md ': 'Mode',\n// 'Mnch': 'Monochromatic',\n// 'MvT ': 'MoveTo',\n// 'Nm ': 'Name',\n// 'Ngtv': 'Negative',\n// 'Nw ': 'New',\n// 'Nose': 'Noise',\n// 'NnIm': 'NonImageData',\n// 'NnLn': 'NonLinear',\n// 'null': 'Null',\n// 'Nm L': 'NumLights',\n// 'Nmbr': 'Number',\n// 'NCch': 'NumberOfCacheLevels',\n// 'NC64': 'NumberOfCacheLevels64',\n// 'NmbO': 'NumberOfChannels',\n// 'NmbC': 'NumberOfChildren',\n// 'NmbD': 'NumberOfDocuments',\n// 'NmbG': 'NumberOfGenerators',\n// // 'NmbL': 'NumberOfLayers',\n// // 'NmbL': 'NumberOfLevels',\n// 'NmbP': 'NumberOfPaths',\n// 'NmbR': 'NumberOfRipples',\n// 'NmbS': 'NumberOfSiblings',\n// 'ObjN': 'ObjectName',\n// 'Ofst': 'Offset',\n// 'Sftt': 'OldSmallFontType',\n// 'On ': 'On',\n// 'Opct': 'Opacity',\n// 'Optm': 'Optimized',\n// 'Ornt': 'Orientation',\n// 'OrgH': 'OriginalHeader',\n// 'OrgT': 'OriginalTransmissionReference',\n// 'OthC': 'OtherCursors',\n// 'OrGl': 'OuterGlow',\n// 'Otpt': 'Output',\n// 'kOBP': 'OutputBlackPoint',\n// 'kOWP': 'OutputWhitePoint',\n// 'OvrC': 'OverprintColors',\n// 'OvrO': 'OverrideOpen',\n// 'ObrP': 'OverridePrinter',\n// 'Ovrd': 'OverrideSave',\n// 'PNGf': 'PNGFilter',\n// 'PGIT': 'PNGInterlaceType',\n// 'PMpf': 'PageFormat',\n// 'PgNm': 'PageNumber',\n// 'PgPs': 'PagePosition',\n// 'PgSt': 'PageSetup',\n// 'PnCK': 'PaintCursorKind',\n// 'PntT': 'PaintType',\n// 'PntC': 'PaintingCursors',\n// 'Plt ': 'Palette',\n// 'PltF': 'PaletteFile',\n// 'PprB': 'PaperBrightness',\n// 'PrIn': 'ParentIndex',\n// 'PrNm': 'ParentName',\n// 'Path': 'Path',\n// 'PthC': 'PathContents',\n// 'PthN': 'PathName',\n// 'Pttn': 'Pattern',\n// 'Pncl': 'PencilWidth',\n// 'Prsp': 'PerspectiveIndex',\n// 'Phsp': 'Phosphors',\n// 'PckI': 'PickerID',\n// 'Pckr': 'PickerKind',\n// 'PPSz': 'PixelPaintSize',\n// 'Pltf': 'Platform',\n// 'PlgF': 'PluginFolder',\n// 'PlgP': 'PluginPrefs',\n// 'Pts ': 'Points',\n// 'Pstn': 'Position',\n// 'PstS': 'PostScriptColor',\n// 'Pstr': 'Posterization',\n// 'PrdC': 'PredefinedColors',\n// 'PrfB': 'PreferBuiltin',\n// 'Prfr': 'Preferences',\n// 'PrsA': 'PreserveAdditional',\n// 'PrsL': 'PreserveLuminosity',\n// 'PrsT': 'PreserveTransparency',\n// 'Prs ': 'Pressure',\n// 'Prvw': 'Preview',\n// 'PrvK': 'PreviewCMYK',\n// 'PrvF': 'PreviewFullSize',\n// 'PrvI': 'PreviewIcon',\n// 'PrvM': 'PreviewMacThumbnail',\n// 'PrvW': 'PreviewWinThumbnail',\n// 'PrvQ': 'PreviewsQuery',\n// 'PMps': 'PrintSettings',\n// 'PrfS': 'ProfileSetup',\n// 'PrvS': 'ProvinceState',\n// 'Qlty': 'Quality',\n// 'QucM': 'QuickMask',\n// 'RGBS': 'RGBSetup',\n// 'Rds ': 'Radius',\n// 'RndS': 'RandomSeed',\n// 'Rt ': 'Ratio',\n// 'Rcnf': 'RecentFiles',\n// 'Rd ': 'Red',\n// 'RdBl': 'RedBlackPoint',\n// 'redFloat': 'RedFloat',\n// 'RdGm': 'RedGamma',\n// 'RdWh': 'RedWhitePoint',\n// 'RdX ': 'RedX',\n// 'RdY ': 'RedY',\n// 'RgsM': 'RegistrationMarks',\n// 'Rltv': 'Relative',\n// 'Rlf ': 'Relief',\n// 'Rfid': 'RenderFidelity',\n// 'Rsmp': 'Resample',\n// 'RWOZ': 'ResizeWindowsOnZoom',\n// 'Rslt': 'Resolution',\n// 'RsrI': 'ResourceID',\n// 'Rspn': 'Response',\n// 'RtnH': 'RetainHeader',\n// 'Rvrs': 'Reverse',\n// 'Rght': 'Right',\n// 'RplM': 'RippleMagnitude',\n// 'RplS': 'RippleSize',\n// 'Rtt ': 'Rotate',\n// 'Rndn': 'Roundness',\n// 'RlrH': 'RulerOriginH',\n// 'RlrV': 'RulerOriginV',\n// 'RlrU': 'RulerUnits',\n// // 'Strt': 'Saturation',\n// 'SvAn': 'SaveAndClose',\n// 'SvCm': 'SaveComposite',\n// 'PltL': 'SavePaletteLocations',\n// 'SvPt': 'SavePaths',\n// 'SvPy': 'SavePyramids',\n// 'Svng': 'Saving',\n// 'Scl ': 'Scale',\n// 'SclH': 'ScaleHorizontal',\n// 'SclV': 'ScaleVertical',\n// 'Scln': 'Scaling',\n// 'Scns': 'Scans',\n// 'ScrD': 'ScratchDisks',\n// 'ScrF': 'ScreenFile',\n// 'ScrT': 'ScreenType',\n// 'Sprt': 'Separations',\n// 'SrlS': 'SerialString',\n// // 'ShdI': 'ShadingIntensity',\n// 'ShdN': 'ShadingNoise',\n// 'ShdS': 'ShadingShape',\n// 'sdwC': 'ShadowColor',\n// // 'ShdI': 'ShadowIntensity',\n// 'ShdL': 'ShadowLevels',\n// 'sdwM': 'ShadowMode',\n// 'sdwO': 'ShadowOpacity',\n// 'Shp ': 'Shape',\n// 'Shrp': 'Sharpness',\n// 'ShrE': 'ShearEd',\n// 'ShrP': 'ShearPoints',\n// 'ShrS': 'ShearSt',\n// 'ShfK': 'ShiftKey',\n// 'ShKT': 'ShiftKeyToolSwitch',\n// 'ShrN': 'ShortNames',\n// 'ShwE': 'ShowEnglishFontNames',\n// 'SwMC': 'ShowMenuColors',\n// 'ShwT': 'ShowToolTips',\n// 'ShTr': 'ShowTransparency',\n// 'Sz ': 'SizeKey',\n// 'Skew': 'Skew',\n// 'Sfts': 'SmallFontType',\n// 'SmBM': 'SmartBlurMode',\n// 'SmBQ': 'SmartBlurQuality',\n// 'Smoo': 'Smooth',\n// 'Smth': 'Smoothness',\n// 'SnpI': 'SnapshotInitial',\n// 'SfCl': 'SoftClip',\n// 'Sftn': 'Softness',\n// 'SoFi': 'SolidFill',\n// 'Srce': 'Source',\n// 'Src2': 'Source2',\n// 'SrcM': 'SourceMode',\n// 'Spcn': 'Spacing',\n// 'SpcI': 'SpecialInstructions',\n// 'SphM': 'SpherizeMode',\n// 'Spot': 'Spot',\n// 'SprR': 'SprayRadius',\n// 'SqrS': 'SquareSize',\n// 'Srcl': 'SrcBlackMax',\n// 'SrcB': 'SrcBlackMin',\n// 'Srcm': 'SrcWhiteMax',\n// 'SrcW': 'SrcWhiteMin',\n// // 'Strt': 'Start',\n// 'StrA': 'StartArrowhead',\n// 'Stte': 'State',\n// 'srgh': 'Strength',\n// 'srgR': 'StrengthRatio',\n// 'Strg': 'Strength_PLUGIN',\n// 'StDt': 'StrokeDetail',\n// 'SDir': 'StrokeDirection',\n// 'StrL': 'StrokeLength',\n// 'StrP': 'StrokePressure',\n// 'StrS': 'StrokeSize',\n// 'StrW': 'StrokeWidth',\n// 'Styl': 'Style',\n// 'Stys': 'Styles',\n// 'StlC': 'StylusIsColor',\n// 'StlO': 'StylusIsOpacity',\n// 'StlP': 'StylusIsPressure',\n// 'StlS': 'StylusIsSize',\n// 'SbpL': 'SubPathList',\n// 'SplC': 'SupplementalCategories',\n// 'SstI': 'SystemInfo',\n// 'SstP': 'SystemPalette',\n// // 'null': 'Target',\n// 'Trgp': 'TargetPath',\n// 'TrgP': 'TargetPathIndex',\n// // 'Lngt': 'TermLength',\n// 'Txt ': 'Text',\n// // 'TxtC': 'TextClickPoint',\n// 'TxtD': 'TextData',\n// 'TxtS': 'TextStyle',\n// 'Txtt': 'TextStyleRange',\n// 'Txtr': 'Texture',\n// // 'TxtC': 'TextureCoverage',\n// 'TxtF': 'TextureFile',\n// 'TxtT': 'TextureType',\n// 'Thsh': 'Threshold',\n// 'TlNm': 'TileNumber',\n// 'TlOf': 'TileOffset',\n// 'TlSz': 'TileSize',\n// 'Ttl ': 'Title',\n// 'T ': 'To',\n// 'TBl ': 'ToBuiltin',\n// 'ToLk': 'ToLinked',\n// 'TMd ': 'ToMode',\n// 'TglO': 'ToggleOthers',\n// 'Tlrn': 'Tolerance',\n// 'Top ': 'Top',\n// 'TtlL': 'TotalLimit',\n// 'Trck': 'Tracking',\n// 'TrnF': 'TransferFunction',\n// // 'TrnS': 'TransferSpec',\n// 'Trns': 'Transparency',\n// // 'TrnG': 'TransparencyGrid',\n// 'TrnC': 'TransparencyGridColors',\n// // 'TrnG': 'TransparencyGridSize',\n// 'TrnP': 'TransparencyPrefs',\n// // 'TrnS': 'TransparencyShape',\n// 'TrnI': 'TransparentIndex',\n// 'TrnW': 'TransparentWhites',\n// 'Twst': 'Twist',\n// 'Type': 'Type',\n// 'UC ': 'UCA',\n// 'URL ': 'URL',\n// 'UndA': 'UndefinedArea',\n// 'Undl': 'Underline',\n// 'UntP': 'UnitsPrefs',\n// 'Untl': 'Untitled',\n// 'UppY': 'UpperY',\n// 'Urgn': 'Urgency',\n// 'AcrS': 'UseAccurateScreens',\n// 'AdPl': 'UseAdditionalPlugins',\n// 'UsCc': 'UseCacheForHistograms',\n// 'UsCr': 'UseCurves',\n// 'UsDf': 'UseDefault',\n// 'uglg': 'UseGlobalAngle',\n// 'UsIC': 'UseICCProfile',\n// 'UsMs': 'UseMask',\n// 'UsrM': 'UserMaskEnabled',\n// 'Usrs': 'UserMaskLinked',\n// 'Usng': 'Using',\n// 'Vl ': 'Value',\n// 'Vrnc': 'Variance',\n// 'Vct0': 'Vector0',\n// 'Vct1': 'Vector1',\n// 'VctC': 'VectorColor',\n// 'VrsF': 'VersionFix',\n// 'VrsM': 'VersionMajor',\n// 'VrsN': 'VersionMinor',\n// 'Vrtc': 'Vertical',\n// 'VrtS': 'VerticalScale',\n// 'Vdlp': 'VideoAlpha',\n// 'Vsbl': 'Visible',\n// 'WtcS': 'WatchSuspension',\n// 'watr': 'Watermark',\n// 'Wvtp': 'WaveType',\n// 'WLMx': 'WavelengthMax',\n// 'WLMn': 'WavelengthMin',\n// 'WbdP': 'WebdavPrefs',\n// 'Wtdg': 'WetEdges',\n// 'What': 'What',\n// 'WhtC': 'WhiteClip',\n// 'WhtI': 'WhiteIntensity',\n// 'WhHi': 'WhiteIsHigh',\n// 'WhtL': 'WhiteLevel',\n// 'WhtP': 'WhitePoint',\n// 'WhPt': 'WholePath',\n// 'Wdth': 'Width',\n// 'WndM': 'WindMethod',\n// 'With': 'With',\n// 'WrPt': 'WorkPath',\n// 'WrkP': 'WorkPathIndex',\n// 'X ': 'X',\n// 'Y ': 'Y',\n// 'Ylw ': 'Yellow',\n// 'ZZTy': 'ZigZagType',\n// 'Alis': '_3DAntiAlias',\n// };\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/\n\nimport {getDataView, getStringFromDataView, getPascalStringFromDataView} from './utils.js';\nimport Types from './types.js';\nimport TagNames from './photoshop-tag-names.js';\n\nexport default {\n read\n};\n\nconst SIGNATURE = '8BIM';\nconst TAG_ID_SIZE = 2;\nconst RESOURCE_LENGTH_SIZE = 4;\n\nconst SIGNATURE_SIZE = SIGNATURE.length;\n\nfunction read(bytes, includeUnknown) {\n const dataView = getDataView(new Uint8Array(bytes).buffer);\n const tags = {};\n let offset = 0;\n\n while (offset < bytes.length) {\n const signature = getStringFromDataView(dataView, offset, SIGNATURE_SIZE);\n offset += SIGNATURE_SIZE;\n const tagId = Types.getShortAt(dataView, offset);\n offset += TAG_ID_SIZE;\n const {tagName, tagNameSize} = getTagName(dataView, offset);\n offset += tagNameSize;\n const resourceSize = Types.getLongAt(dataView, offset);\n offset += RESOURCE_LENGTH_SIZE;\n if (signature === SIGNATURE) {\n const valueDataView = getDataView(dataView.buffer, offset, resourceSize);\n const tag = {\n id: tagId,\n value: getStringFromDataView(valueDataView, 0, resourceSize),\n };\n if (TagNames[tagId]) {\n try {\n tag.description = TagNames[tagId].description(valueDataView);\n } catch (error) {\n tag.description = '';\n }\n tags[tagName ? tagName : TagNames[tagId].name] = tag;\n } else if (includeUnknown) {\n tags[`undefined-${tagId}`] = tag;\n }\n }\n offset += resourceSize + (resourceSize % 2);\n }\n\n return tags;\n}\n\nfunction getTagName(dataView, offset) {\n // The name is encoded as a Pascal string (the string is prefixed with one\n // byte containing the length of the string) and everything is padded with a\n // null byte to make the size even.\n const [stringSize, string] = getPascalStringFromDataView(dataView, offset);\n return {\n tagName: string,\n tagNameSize: 1 + stringSize + (stringSize % 2 === 0 ? 1 : 0)\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {getStringFromDataView} from './utils.js';\n\nexport const iccTags = {\n 'desc': {\n 'name': 'ICC Description',\n },\n 'cprt': {\n 'name': 'ICC Copyright',\n },\n 'dmdd': {\n 'name': 'ICC Device Model Description',\n },\n 'vued': {\n 'name': 'ICC Viewing Conditions Description',\n },\n 'dmnd': {\n 'name': 'ICC Device Manufacturer for Display',\n },\n 'tech': {\n 'name': 'Technology',\n },\n};\n\nexport const iccProfile = {\n 4: {\n 'name': 'Preferred CMM type',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => value !== null ? toCompany(value) : '',\n },\n 8: {\n 'name': 'Profile Version',\n 'value': (dataView, offset) => {\n return (dataView.getUint8(offset)).toString(10) + '.'\n + (dataView.getUint8(offset + 1) >> 4).toString(10) + '.'\n + (dataView.getUint8(offset + 1) % 16).toString(10);\n }\n },\n 12: {\n 'name': 'Profile/Device class',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => {\n switch (value.toLowerCase()) {\n case 'scnr': return 'Input Device profile';\n case 'mntr': return 'Display Device profile';\n case 'prtr': return 'Output Device profile';\n case 'link': return 'DeviceLink profile';\n case 'abst': return 'Abstract profile';\n case 'spac': return 'ColorSpace profile';\n case 'nmcl': return 'NamedColor profile';\n case 'cenc': return 'ColorEncodingSpace profile';\n case 'mid ': return 'MultiplexIdentification profile';\n case 'mlnk': return 'MultiplexLink profile';\n case 'mvis': return 'MultiplexVisualization profile';\n default: return value;\n }\n }\n },\n 16: {\n 'name': 'Color Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 20: {\n 'name': 'Connection Space',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 24: {\n 'name': 'ICC Profile Date',\n 'value': (dataView, offset) => parseDate(dataView, offset).toISOString()\n },\n 36: {\n 'name': 'ICC Signature',\n 'value': (dataView, offset) => sliceToString(dataView.buffer.slice(offset, offset + 4))\n },\n 40: {\n 'name': 'Primary Platform',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 48: {\n 'name': 'Device Manufacturer',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4),\n 'description': (value) => toCompany(value)\n },\n 52: {\n 'name': 'Device Model Number',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n 64: {\n 'name': 'Rendering Intent',\n 'value': (dataView, offset) => dataView.getUint32(offset),\n 'description': (value) => {\n switch (value) {\n case 0: return 'Perceptual';\n case 1: return 'Relative Colorimetric';\n case 2: return 'Saturation';\n case 3: return 'Absolute Colorimetric';\n default: return value;\n }\n }\n },\n\n 80: {\n 'name': 'Profile Creator',\n 'value': (dataView, offset) => getStringFromDataView(dataView, offset, 4)\n },\n};\n\nfunction parseDate(dataView, offset) {\n const year = dataView.getUint16(offset);\n const month = dataView.getUint16(offset + 2) - 1;\n const day = dataView.getUint16(offset + 4);\n const hours = dataView.getUint16(offset + 6);\n const minutes = dataView.getUint16(offset + 8);\n const seconds = dataView.getUint16(offset + 10);\n return new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction toCompany(value) {\n switch (value.toLowerCase()) {\n case 'appl': return 'Apple';\n case 'adbe': return 'Adobe';\n case 'msft': return 'Microsoft';\n case 'sunw': return 'Sun Microsystems';\n case 'sgi': return 'Silicon Graphics';\n case 'tgnt': return 'Taligent';\n default: return value;\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\nimport {iccTags, iccProfile} from './icc-tag-names.js';\nimport {getStringFromDataView, getUnicodeStringFromDataView, decompress, COMPRESSION_METHOD_NONE, COMPRESSION_METHOD_DEFLATE} from './utils.js';\n\nexport default {\n read\n};\n\nconst PROFILE_HEADER_LENGTH = 84;\nconst ICC_TAG_COUNT_OFFSET = 128;\nconst ICC_SIGNATURE = 'acsp';\nconst TAG_TYPE_DESC = 'desc';\nconst TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE = 'mluc';\nconst TAG_TYPE_TEXT = 'text';\nconst TAG_TYPE_SIGNATURE = 'sig ';\nconst TAG_TABLE_SINGLE_TAG_DATA = 12;\n\n// ICC profile data can be longer than application segment max length of ~64k.\n// so it can be split into multiple APP2 segments. Each segment includes\n// total chunk count and chunk number.\n// Here we read all chunks into single continuous array of bytes.\n// Compressed ICC profile data only has support for a single chunk.\nfunction read(dataView, iccData, async) {\n if (async && iccData[0].compressionMethod !== COMPRESSION_METHOD_NONE) {\n return readCompressedIcc(dataView, iccData);\n }\n\n return readIcc(dataView, iccData);\n}\n\nfunction readCompressedIcc(dataView, iccData) {\n if (!compressionMethodIsSupported(iccData[0].compressionMethod)) {\n return {};\n }\n const compressedDataView = new DataView(dataView.buffer.slice(iccData[0].offset, iccData[0].offset + iccData[0].length));\n return decompress(compressedDataView, iccData[0].compressionMethod, 'utf-8', 'dataview')\n .then(parseTags)\n .catch(() => ({}));\n}\n\nfunction compressionMethodIsSupported(compressionMethod) {\n return compressionMethod === COMPRESSION_METHOD_DEFLATE;\n}\n\nfunction readIcc(dataView, iccData) {\n try {\n const totalIccProfileLength = iccData.reduce((sum, icc) => sum + icc.length, 0);\n\n const iccBinaryData = new Uint8Array(totalIccProfileLength);\n let offset = 0;\n const buffer = getBuffer(dataView);\n\n for (let chunkNumber = 1; chunkNumber <= iccData.length; chunkNumber++) {\n const iccDataChunk = iccData.find((x) => x.chunkNumber === chunkNumber);\n if (!iccDataChunk) {\n throw new Error(`ICC chunk ${chunkNumber} not found`);\n }\n\n const data = buffer.slice(iccDataChunk.offset, iccDataChunk.offset + iccDataChunk.length);\n const chunkData = new Uint8Array(data);\n\n iccBinaryData.set(chunkData, offset);\n offset += chunkData.length;\n }\n\n return parseTags(new DataView(iccBinaryData.buffer));\n } catch (error) {\n return {};\n }\n}\n\nfunction getBuffer(dataView) {\n if (Array.isArray(dataView)) {\n return (new DataView(Uint8Array.from(dataView).buffer)).buffer;\n }\n return dataView.buffer;\n}\n\nfunction iccDoesNotHaveTagCount(buffer) {\n return buffer.length < (ICC_TAG_COUNT_OFFSET + 4);\n}\n\nfunction hasTagsData(buffer, tagHeaderOffset) {\n return buffer.length < tagHeaderOffset + TAG_TABLE_SINGLE_TAG_DATA;\n}\n\nexport function parseTags(dataView) {\n const buffer = dataView.buffer;\n\n const length = dataView.getUint32();\n if (dataView.byteLength !== length) {\n throw new Error('ICC profile length not matching');\n }\n\n if (dataView.length < PROFILE_HEADER_LENGTH) {\n throw new Error('ICC profile too short');\n }\n\n const tags = {};\n\n const iccProfileKeys = Object.keys(iccProfile);\n for (let i = 0; i < iccProfileKeys.length; i++) {\n const offset = iccProfileKeys[i];\n const profileEntry = iccProfile[offset];\n const value = profileEntry.value(dataView, parseInt(offset, 10));\n let description = value;\n if (profileEntry.description) {\n description = profileEntry.description(value);\n }\n\n tags[profileEntry.name] = {\n value,\n description\n };\n }\n\n const signature = sliceToString(buffer.slice(36, 40));\n if (signature !== ICC_SIGNATURE) {\n throw new Error('ICC profile: missing signature');\n }\n\n /* ICC data is incomplete but we have header parsed so lets return it */\n if (iccDoesNotHaveTagCount(buffer)) {\n return tags;\n }\n\n const tagCount = dataView.getUint32(128);\n let tagHeaderOffset = 132;\n\n for (let i = 0; i < tagCount; i++) {\n if (hasTagsData(buffer, tagHeaderOffset)) {\n // Tags are corrupted (offset too far), return what we parsed until now\n return tags;\n }\n const tagSignature = getStringFromDataView(dataView, tagHeaderOffset, 4);\n const tagOffset = dataView.getUint32(tagHeaderOffset + 4);\n const tagSize = dataView.getUint32(tagHeaderOffset + 8);\n\n if (tagOffset > buffer.length) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n const tagType = getStringFromDataView(dataView, tagOffset, 4);\n\n if (tagType === TAG_TYPE_DESC) {\n const tagValueSize = dataView.getUint32(tagOffset + 8);\n if (tagValueSize > tagSize) {\n // Tag data is invalid, lets return what we managed to parse\n return tags;\n }\n\n const val = sliceToString(buffer.slice(tagOffset + 12, tagOffset + tagValueSize + 11));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE) {\n const numRecords = dataView.getUint32(tagOffset + 8);\n const recordSize = dataView.getUint32(tagOffset + 12);\n let offset = tagOffset + 16;\n const val = [];\n for (let recordNum = 0; recordNum < numRecords; recordNum++) {\n const languageCode = getStringFromDataView(dataView, offset + 0, 2);\n const countryCode = getStringFromDataView(dataView, offset + 2, 2);\n const textLength = dataView.getUint32(offset + 4);\n const textOffset = dataView.getUint32(offset + 8);\n\n const text = getUnicodeStringFromDataView(dataView, tagOffset + textOffset, textLength);\n val.push({languageCode, countryCode, text});\n offset += recordSize;\n }\n if (numRecords === 1) {\n addTag(tags, tagSignature, val[0].text);\n } else {\n const valObj = {};\n for (let valIndex = 0; valIndex < val.length; valIndex++) {\n valObj[`${val[valIndex].languageCode}-${val[valIndex].countryCode}`] = val[valIndex].text;\n }\n addTag(tags, tagSignature, valObj);\n }\n } else if (tagType === TAG_TYPE_TEXT) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + tagSize - 7));\n addTag(tags, tagSignature, val);\n } else if (tagType === TAG_TYPE_SIGNATURE) {\n const val = sliceToString(buffer.slice(tagOffset + 8, tagOffset + 12));\n addTag(tags, tagSignature, val);\n }\n tagHeaderOffset = tagHeaderOffset + 12;\n }\n\n return tags;\n}\n\nfunction sliceToString(slice) {\n return String.fromCharCode.apply(null, new Uint8Array(slice));\n}\n\nfunction addTag(tags, tagSignature, value) {\n if (iccTags[tagSignature]) {\n tags[iccTags[tagSignature].name] = {value, description: value};\n } else {\n tags[tagSignature] = {value, description: value};\n }\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Reverse-engineered docs:\n// https://exiftool.org/makernote_types.html\n// https://exiv2.org/makernote.html\n// https://exiv2.org/tags-canon.html\n// https://gist.github.com/redaktor/bae0ef2377ab70bc5276\n// https://www.ozhiker.com/electronics/pjmt/jpeg_info/canon_mn.html\n\nimport {objectAssign} from './utils.js';\nimport {readIfd} from './tags-helpers.js';\nimport {IFD_TYPE_CANON} from './tag-names.js';\n\nconst SHOT_INFO_AUTO_ROTATE = 27; // First position is size.\n\nexport default {\n read,\n SHOT_INFO_AUTO_ROTATE\n};\n\nfunction read(dataView, tiffHeaderOffset, offset, byteOrder, includeUnknown) {\n let tags = readIfd(dataView, IFD_TYPE_CANON, tiffHeaderOffset, tiffHeaderOffset + offset, byteOrder, includeUnknown);\n\n if (tags['ShotInfo']) {\n tags = objectAssign({}, tags, parseShotInfo(tags['ShotInfo'].value));\n delete tags['ShotInfo'];\n }\n\n return tags;\n}\n\nfunction parseShotInfo(shotInfoData) {\n const tags = {};\n\n if (shotInfoData[SHOT_INFO_AUTO_ROTATE] !== undefined) {\n tags['AutoRotate'] = {\n value: shotInfoData[SHOT_INFO_AUTO_ROTATE],\n description: getAutoRotateDescription(shotInfoData[SHOT_INFO_AUTO_ROTATE])\n };\n }\n\n return tags;\n}\n\nfunction getAutoRotateDescription(autoRotate) {\n if (autoRotate === 0) {\n return 'None';\n }\n if (autoRotate === 1) {\n return 'Rotate 90 CW';\n }\n if (autoRotate === 2) {\n return 'Rotate 180';\n }\n if (autoRotate === 3) {\n return 'Rotate 270 CW';\n }\n return 'Unknown';\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, fileDataOffset) {\n return {\n 'Image Width': getImageWidth(dataView, fileDataOffset),\n 'Image Height': getImageHeight(dataView, fileDataOffset),\n 'Bit Depth': getBitDepth(dataView, fileDataOffset),\n 'Color Type': getColorType(dataView, fileDataOffset),\n 'Compression': getCompression(dataView, fileDataOffset),\n 'Filter': getFilter(dataView, fileDataOffset),\n 'Interlace': getInterlace(dataView, fileDataOffset)\n };\n}\n\nfunction getImageWidth(dataView, fileDataOffset) {\n const OFFSET = 0;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView, fileDataOffset) {\n const OFFSET = 4;\n const SIZE = 4;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getBitDepth(dataView, fileDataOffset) {\n const OFFSET = 8;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: `${value}`\n };\n}\n\nfunction getColorType(dataView, fileDataOffset) {\n const OFFSET = 9;\n const SIZE = 1;\n const COLOR_TYPES = {\n 0: 'Grayscale',\n 2: 'RGB',\n 3: 'Palette',\n 4: 'Grayscale with Alpha',\n 6: 'RGB with Alpha'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: COLOR_TYPES[value] || 'Unknown'\n };\n}\n\nfunction getCompression(dataView, fileDataOffset) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Deflate/Inflate' : 'Unknown'\n };\n}\n\nfunction getFilter(dataView, fileDataOffset) {\n const OFFSET = 11;\n const SIZE = 1;\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: value === 0 ? 'Adaptive' : 'Unknown'\n };\n}\n\nfunction getInterlace(dataView, fileDataOffset) {\n const OFFSET = 12;\n const SIZE = 1;\n const INTERLACE_TYPES = {\n 0: 'Noninterlaced',\n 1: 'Adam7 Interlace'\n };\n\n if (fileDataOffset + OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, fileDataOffset + OFFSET);\n return {\n value,\n description: INTERLACE_TYPES[value] || 'Unknown'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// Specification: http://www.libpng.org/pub/png/spec/1.2/\n\nimport {getStringValueFromArray, getStringFromDataView, decompress, COMPRESSION_METHOD_NONE} from './utils.js';\nimport TagDecoder from './tag-decoder.js';\nimport {TYPE_TEXT, TYPE_ITXT, TYPE_ZTXT} from './image-header-png.js';\nimport Tags from './tags.js';\nimport IptcTags from './iptc-tags.js';\nimport Constants from './constants.js';\n\nexport default {\n read\n};\n\nconst STATE_KEYWORD = 'STATE_KEYWORD';\nconst STATE_COMPRESSION = 'STATE_COMPRESSION';\nconst STATE_LANG = 'STATE_LANG';\nconst STATE_TRANSLATED_KEYWORD = 'STATE_TRANSLATED_KEYWORD';\nconst STATE_TEXT = 'STATE_TEXT';\nconst COMPRESSION_SECTION_ITXT_EXTRA_BYTE = 1;\nconst COMPRESSION_FLAG_COMPRESSED = 1;\nconst EXIF_OFFSET = 6;\n\nfunction read(dataView, pngTextChunks, async, includeUnknown) {\n const tags = {};\n const tagsPromises = [];\n for (let i = 0; i < pngTextChunks.length; i++) {\n const {offset, length, type} = pngTextChunks[i];\n const nameAndValue = getNameAndValue(dataView, offset, length, type, async);\n if (nameAndValue instanceof Promise) {\n tagsPromises.push(nameAndValue.then(({name, value, description}) => {\n try {\n if (Constants.USE_EXIF && isExifGroupTag(name, value)) {\n return {\n __exif: Tags.read(decodeRawData(value), EXIF_OFFSET, includeUnknown).tags\n };\n } else if (Constants.USE_IPTC && isIptcGroupTag(name, value)) {\n return {\n __iptc: IptcTags.read(decodeRawData(value), 0, includeUnknown)\n };\n } else if (name && !isExifGroupTag(name, value) && !isIptcGroupTag(name, value)) {\n return {\n [name]: {\n value,\n description\n }\n };\n }\n } catch (error) {\n // Ignore the broken tag.\n }\n return {};\n }));\n } else {\n const {name, value, description} = nameAndValue;\n if (name) {\n tags[name] = {\n value,\n description\n };\n }\n }\n }\n\n return {\n readTags: tags,\n readTagsPromise: tagsPromises.length > 0 ? Promise.all(tagsPromises) : undefined\n };\n}\n\nfunction getNameAndValue(dataView, offset, length, type, async) {\n const keywordChars = [];\n const langChars = [];\n const translatedKeywordChars = [];\n let valueChars;\n let parsingState = STATE_KEYWORD;\n let compressionMethod = COMPRESSION_METHOD_NONE;\n\n for (let i = 0; i < length && offset + i < dataView.byteLength; i++) {\n if (parsingState === STATE_COMPRESSION) {\n compressionMethod = getCompressionMethod({type, dataView, offset: offset + i});\n if (type === TYPE_ITXT) {\n i += COMPRESSION_SECTION_ITXT_EXTRA_BYTE;\n }\n parsingState = moveToNextState(type, parsingState);\n continue;\n } else if (parsingState === STATE_TEXT) {\n valueChars = new DataView(dataView.buffer.slice(offset + i, offset + length));\n break;\n }\n const byte = dataView.getUint8(offset + i);\n if (byte === 0) {\n parsingState = moveToNextState(type, parsingState);\n } else if (parsingState === STATE_KEYWORD) {\n keywordChars.push(byte);\n } else if (parsingState === STATE_LANG) {\n langChars.push(byte);\n } else if (parsingState === STATE_TRANSLATED_KEYWORD) {\n translatedKeywordChars.push(byte);\n }\n }\n\n if (compressionMethod !== COMPRESSION_METHOD_NONE && !async) {\n return {};\n }\n const decompressedValueChars = decompress(valueChars, compressionMethod, getEncodingFromType(type));\n if (decompressedValueChars instanceof Promise) {\n return decompressedValueChars\n .then((_decompressedValueChars) => constructTag(_decompressedValueChars, type, langChars, keywordChars))\n .catch(() => constructTag(''.split(''), type, langChars, keywordChars));\n }\n return constructTag(decompressedValueChars, type, langChars, keywordChars);\n}\n\nfunction getCompressionMethod({type, dataView, offset}) {\n if (type === TYPE_ITXT) {\n if (dataView.getUint8(offset) === COMPRESSION_FLAG_COMPRESSED) {\n return dataView.getUint8(offset + 1);\n }\n } else if (type === TYPE_ZTXT) {\n return dataView.getUint8(offset);\n }\n return COMPRESSION_METHOD_NONE;\n}\n\nfunction moveToNextState(type, parsingState) {\n if (parsingState === STATE_KEYWORD && [TYPE_ITXT, TYPE_ZTXT].includes(type)) {\n return STATE_COMPRESSION;\n }\n if (parsingState === STATE_COMPRESSION) {\n if (type === TYPE_ITXT) {\n return STATE_LANG;\n }\n return STATE_TEXT;\n }\n if (parsingState === STATE_LANG) {\n return STATE_TRANSLATED_KEYWORD;\n }\n return STATE_TEXT;\n}\n\nfunction getEncodingFromType(type) {\n if (type === TYPE_TEXT || type === TYPE_ZTXT) {\n return 'latin1';\n }\n return 'utf-8';\n}\n\nfunction constructTag(valueChars, type, langChars, keywordChars) {\n const value = getValue(valueChars);\n return {\n name: getName(type, langChars, keywordChars),\n value,\n description: type === TYPE_ITXT ? getDescription(valueChars) : value\n };\n}\n\nfunction getName(type, langChars, keywordChars) {\n const name = getStringValueFromArray(keywordChars);\n if (type === TYPE_TEXT || langChars.length === 0) {\n return name;\n }\n const lang = getStringValueFromArray(langChars);\n return `${name} (${lang})`;\n}\n\nfunction getValue(valueChars) {\n if (valueChars instanceof DataView) {\n return getStringFromDataView(valueChars, 0, valueChars.byteLength);\n }\n return valueChars;\n}\n\nfunction getDescription(valueChars) {\n return TagDecoder.decode('UTF-8', valueChars);\n}\n\nfunction isExifGroupTag(name, value) {\n return name.toLowerCase() === 'raw profile type exif' && value.substring(1, 5) === 'exif';\n}\n\nfunction isIptcGroupTag(name, value) {\n return name.toLowerCase() === 'raw profile type iptc' && value.substring(1, 5) === 'iptc';\n}\n\nfunction decodeRawData(value) {\n const parts = value.match(/\\n(exif|iptc)\\n\\s*\\d+\\n([\\s\\S]*)$/);\n return hexToDataView(parts[2].replace(/\\n/g, ''));\n}\n\nfunction hexToDataView(hex) {\n const dataView = new DataView(new ArrayBuffer(hex.length / 2));\n for (let i = 0; i < hex.length; i += 2) {\n dataView.setUint8(i / 2, parseInt(hex.substring(i, i + 2), 16));\n }\n return dataView;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\nimport {PNG_CHUNK_LENGTH_OFFSET, PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_DATA_OFFSET, PNG_CHUNK_TYPE_SIZE, TYPE_PHYS, TYPE_TIME} from './image-header-png.js';\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView, chunkOffsets) {\n const tags = {};\n\n for (let i = 0; i < chunkOffsets.length; i++) {\n const chunkLength = Types.getLongAt(dataView, chunkOffsets[i] + PNG_CHUNK_LENGTH_OFFSET);\n const chunkType = getStringFromDataView(dataView, chunkOffsets[i] + PNG_CHUNK_TYPE_OFFSET, PNG_CHUNK_TYPE_SIZE);\n\n if (chunkType === TYPE_PHYS) {\n tags['Pixels Per Unit X'] = getPixelsPerUnitX(dataView, chunkOffsets[i], chunkLength);\n tags['Pixels Per Unit Y'] = getPixelsPerUnitY(dataView, chunkOffsets[i], chunkLength);\n tags['Pixel Units'] = getPixelUnits(dataView, chunkOffsets[i], chunkLength);\n } else if (chunkType === TYPE_TIME) {\n tags['Modify Date'] = getModifyDate(dataView, chunkOffsets[i], chunkLength);\n }\n }\n\n return tags;\n}\n\nfunction getPixelsPerUnitX(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 0;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelsPerUnitY(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 4;\n const TAG_SIZE = 4;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getLongAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: '' + value\n };\n}\n\nfunction getPixelUnits(dataView, chunkOffset, chunkLength) {\n const TAG_OFFSET = 8;\n const TAG_SIZE = 1;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, TAG_OFFSET, TAG_SIZE)) {\n return undefined;\n }\n\n const value = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + TAG_OFFSET);\n\n return {\n value,\n description: value === 1 ? 'meters' : 'Unknown'\n };\n}\n\nfunction getModifyDate(dataView, chunkOffset, chunkLength) {\n const TIME_TAG_SIZE = 7;\n\n if (!tagFitsInBuffer(dataView, chunkOffset, chunkLength, 0, TIME_TAG_SIZE)) {\n return undefined;\n }\n\n const year = Types.getShortAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET);\n const month = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 2);\n const day = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 3);\n const hours = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 4);\n const minutes = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 5);\n const seconds = Types.getByteAt(dataView, chunkOffset + PNG_CHUNK_DATA_OFFSET + 6);\n\n return {\n value: [year, month, day, hours, minutes, seconds],\n description: `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)} ${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}`\n };\n}\n\nfunction tagFitsInBuffer(dataView, chunkOffset, chunkLength, tagOffset, tagSize) {\n return tagOffset + tagSize <= chunkLength && chunkOffset + PNG_CHUNK_DATA_OFFSET + tagOffset + tagSize <= dataView.byteLength;\n}\n\nfunction pad(number, size) {\n return `${'0'.repeat(size - ('' + number).length)}${number}`;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport Types from './types.js';\n\nexport default {\n read\n};\n\nconst IMAGE_WIDTH_OFFSET = 4;\nconst IMAGE_HEIGHT_OFFSET = 7;\n\n// https://developers.google.com/speed/webp/docs/riff_container#extended_file_format\nfunction read(dataView, chunkOffset) {\n const tags = {};\n\n const flags = Types.getByteAt(dataView, chunkOffset);\n\n tags['Alpha'] = getAlpha(flags);\n tags['Animation'] = getAnimation(flags);\n tags['ImageWidth'] = getThreeByteValue(dataView, chunkOffset + IMAGE_WIDTH_OFFSET);\n tags['ImageHeight'] = getThreeByteValue(dataView, chunkOffset + IMAGE_HEIGHT_OFFSET);\n\n return tags;\n}\n\nfunction getAlpha(flags) {\n const value = flags & 0x10;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getAnimation(flags) {\n const value = flags & 0x02;\n return {\n value: value ? 1 : 0,\n description: value ? 'Yes' : 'No'\n };\n}\n\nfunction getThreeByteValue(dataView, offset) {\n // Values are stored little-endian.\n const value = Types.getByteAt(dataView, offset)\n + 256 * Types.getByteAt(dataView, offset + 1)\n + 256 * 256 * Types.getByteAt(dataView, offset + 2)\n + 1; // Value is 1-based, i.e. a value of 7 means 8px.\n\n return {\n value,\n description: value + 'px'\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n// https://www.w3.org/Graphics/GIF/spec-gif87.txt\n// https://www.w3.org/Graphics/GIF/spec-gif89a.txt\n\nimport {getStringFromDataView} from './utils.js';\n\nexport default {\n read\n};\n\nfunction read(dataView) {\n return {\n 'GIF Version': getGifVersion(dataView),\n 'Image Width': getImageWidth(dataView),\n 'Image Height': getImageHeight(dataView),\n 'Global Color Map': getGlobalColorMap(dataView),\n 'Bits Per Pixel': getBitDepth(dataView),\n 'Color Resolution Depth': getColorResolution(dataView)\n };\n}\n\nfunction getGifVersion(dataView) {\n const OFFSET = 3;\n const SIZE = 3;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = getStringFromDataView(dataView, OFFSET, SIZE);\n return {\n value,\n description: value\n };\n}\n\nfunction getImageWidth(dataView) {\n const OFFSET = 6;\n const SIZE = 2;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = dataView.getUint16(OFFSET, true);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getImageHeight(dataView) {\n const OFFSET = 8;\n const SIZE = 2;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const value = dataView.getUint16(OFFSET, true);\n return {\n value,\n description: `${value}px`\n };\n}\n\nfunction getGlobalColorMap(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = (byteValue & 0b10000000) >>> 7;\n return {\n value,\n description: value === 1 ? 'Yes' : 'No'\n };\n}\n\nfunction getColorResolution(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = ((byteValue & 0b01110000) >>> 4) + 1; // Zero-based.\n return {\n value,\n description: `${value} ${value === 1 ? 'bit' : 'bits'}`\n };\n}\n\nfunction getBitDepth(dataView) {\n const OFFSET = 10;\n const SIZE = 1;\n\n if (OFFSET + SIZE > dataView.byteLength) {\n return undefined;\n }\n\n const byteValue = dataView.getUint8(OFFSET);\n const value = (byteValue & 0b00000111) + 1; // Zero-based.\n return {\n value,\n description: `${value} ${value === 1 ? 'bit' : 'bits'}`\n };\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\nimport {deferInit, getBase64Image} from './utils.js';\n\n// https://exiftool.org/TagNames/EXIF.html#Compression\nconst COMPRESSION_JPEG = [6, 7, 99];\n\nexport default {\n get,\n};\n\nfunction get(dataView, thumbnailTags, tiffHeaderOffset) {\n if (hasJpegThumbnail(thumbnailTags)) {\n thumbnailTags.type = 'image/jpeg';\n const offset = tiffHeaderOffset + thumbnailTags.JPEGInterchangeFormat.value;\n thumbnailTags.image = dataView.buffer.slice(offset, offset + thumbnailTags.JPEGInterchangeFormatLength.value);\n deferInit(thumbnailTags, 'base64', function () {\n return getBase64Image(this.image);\n });\n }\n\n // There is a small possibility of thumbnails in TIFF format but they are\n // not stored as a self-contained image file and would be much more\n // difficult to extract.\n // https://exiftool.org/forum/index.php?topic=3273.msg14778#msg14778\n\n return thumbnailTags;\n}\n\nfunction hasJpegThumbnail(tags) {\n return tags && ((tags.Compression === undefined) || (COMPRESSION_JPEG.includes(tags.Compression.value)))\n && tags.JPEGInterchangeFormat && tags.JPEGInterchangeFormat.value\n && tags.JPEGInterchangeFormatLength && tags.JPEGInterchangeFormatLength.value;\n}\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/. */\n\n/**\n * Thrown when no Exif metadata was found for the given image.\n *\n * @param {string} message The error message.\n */\nfunction MetadataMissingError(message) {\n this.name = 'MetadataMissingError';\n this.message = message || 'No Exif data';\n this.stack = (new Error()).stack;\n}\n\nMetadataMissingError.prototype = new Error;\n\nexport default {\n MetadataMissingError,\n};\n","/**\n * ExifReader\n * http://github.com/mattiasw/exifreader\n * Copyright (C) 2011-2023 Mattias Wallander \n * This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at https://mozilla.org/MPL/2.0/.\n */\n/* global Buffer, __non_webpack_require__ */\n\nimport {objectAssign, dataUriToBuffer} from './utils.js';\nimport DataViewWrapper from './dataview.js';\nimport Constants from './constants.js';\nimport {getStringValueFromArray} from './utils.js';\nimport {getCalculatedGpsValue} from './tag-names-utils.js';\nimport ImageHeader from './image-header.js';\nimport Tags from './tags.js';\nimport MpfTags from './mpf-tags.js';\nimport FileTags from './file-tags.js';\nimport JfifTags from './jfif-tags.js';\nimport IptcTags from './iptc-tags.js';\nimport XmpTags from './xmp-tags.js';\nimport PhotoshopTags from './photoshop-tags.js';\nimport IccTags from './icc-tags.js';\nimport CanonTags from './canon-tags.js';\nimport PngFileTags from './png-file-tags.js';\nimport PngTextTags from './png-text-tags.js';\nimport PngTags from './png-tags.js';\nimport Vp8xTags from './vp8x-tags.js';\nimport GifFileTags from './gif-file-tags.js';\nimport Thumbnail from './thumbnail.js';\nimport exifErrors from './errors.js';\n\nexport default {\n load,\n loadView,\n errors: exifErrors,\n};\n\nexport const errors = exifErrors;\n\nexport function load(data, options = {}) {\n if (isFilePathOrURL(data)) {\n options.async = true;\n return loadFile(data, options).then((fileContents) => loadFromData(fileContents, options));\n }\n if (isBrowserFileObject(data)) {\n options.async = true;\n return loadFileObject(data).then((fileContents) => loadFromData(fileContents, options));\n }\n return loadFromData(data, options);\n}\n\nfunction isFilePathOrURL(data) {\n return typeof data === 'string';\n}\n\nfunction loadFile(filename, options) {\n if (/^\\w+:\\/\\//.test(filename)) {\n if (typeof fetch !== 'undefined') {\n return fetchRemoteFile(filename, options);\n }\n\n return nodeGetRemoteFile(filename, options);\n }\n\n if (isDataUri(filename)) {\n return Promise.resolve(dataUriToBuffer(filename));\n }\n\n return loadLocalFile(filename, options);\n}\n\nfunction fetchRemoteFile(url, {length} = {}) {\n const options = {method: 'GET'};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n return fetch(url, options).then((response) => response.arrayBuffer());\n}\n\nfunction nodeGetRemoteFile(url, {length} = {}) {\n return new Promise((resolve, reject) => {\n const options = {};\n if (Number.isInteger(length) && length >= 0) {\n options.headers = {\n range: `bytes=0-${length - 1}`,\n };\n }\n\n const get = requireNodeGet(url);\n get(url, options, (response) => {\n if ((response.statusCode >= 200) && (response.statusCode <= 299)) {\n const data = [];\n response.on('data', (chunk) => data.push(Buffer.from(chunk)));\n response.on('error', (error) => reject(error));\n response.on('end', () => resolve(Buffer.concat(data)));\n } else {\n reject(`Could not fetch file: ${response.statusCode} ${response.statusMessage}`);\n response.resume();\n }\n }).on('error', (error) => reject(error));\n });\n}\n\nfunction requireNodeGet(url) {\n if (/^https:\\/\\//.test(url)) {\n return __non_webpack_require__('https').get;\n }\n return __non_webpack_require__('http').get;\n}\n\nfunction isDataUri(filename) {\n return /^data:[^;,]*(;base64)?,/.test(filename);\n}\n\nfunction loadLocalFile(filename, {length} = {}) {\n return new Promise((resolve, reject) => {\n const fs = requireNodeFs();\n fs.open(filename, (error, fd) => {\n if (error) {\n reject(error);\n } else {\n fs.stat(filename, (error, stat) => {\n if (error) {\n reject(error);\n } else {\n const size = Math.min(stat.size, length !== undefined ? length : stat.size);\n const buffer = Buffer.alloc(size);\n const options = {\n buffer,\n length: size\n };\n fs.read(fd, options, (error) => {\n if (error) {\n reject(error);\n } else {\n fs.close(fd, (error) => {\n if (error) {\n console.warn(`Could not close file ${filename}:`, error); // eslint-disable-line no-console\n }\n resolve(buffer);\n });\n }\n });\n }\n });\n }\n });\n });\n}\n\nfunction requireNodeFs() {\n try {\n return __non_webpack_require__('fs');\n } catch (error) {\n return undefined;\n }\n}\n\nfunction isBrowserFileObject(data) {\n return (typeof window !== 'undefined') && (typeof File !== 'undefined') && (data instanceof File);\n}\n\nfunction loadFileObject(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (readerEvent) => resolve(readerEvent.target.result);\n reader.onerror = () => reject(reader.error);\n reader.readAsArrayBuffer(file);\n });\n}\n\nfunction loadFromData(data, options) {\n if (isNodeBuffer(data)) {\n // File data read in Node can share the underlying buffer with other\n // data. Therefore it's safest to get a new one to avoid weird bugs.\n data = (new Uint8Array(data)).buffer;\n }\n return loadView(getDataView(data), options);\n}\n\nfunction isNodeBuffer(data) {\n try {\n return Buffer.isBuffer(data);\n } catch (error) {\n return false;\n }\n}\n\nfunction getDataView(data) {\n try {\n return new DataView(data);\n } catch (error) {\n return new DataViewWrapper(data);\n }\n}\n\nexport function loadView(\n dataView,\n {expanded = false, async = false, includeUnknown = false} = {expanded: false, async: false, includeUnknown: false}\n) {\n let foundMetaData = false;\n let tags = {};\n const tagsPromises = [];\n\n const {\n fileType,\n fileDataOffset,\n jfifDataOffset,\n tiffHeaderOffset,\n iptcDataOffset,\n xmpChunks,\n iccChunks,\n mpfDataOffset,\n pngHeaderOffset,\n pngTextChunks,\n pngChunkOffsets,\n vp8xChunkOffset,\n gifHeaderOffset\n } = ImageHeader.parseAppMarkers(dataView, async);\n\n if (Constants.USE_JPEG && Constants.USE_FILE && hasFileData(fileDataOffset)) {\n foundMetaData = true;\n const readTags = FileTags.read(dataView, fileDataOffset);\n if (expanded) {\n tags.file = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_JFIF && hasJfifData(jfifDataOffset)) {\n foundMetaData = true;\n const readTags = JfifTags.read(dataView, jfifDataOffset);\n if (expanded) {\n tags.jfif = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_EXIF && hasExifData(tiffHeaderOffset)) {\n foundMetaData = true;\n const {tags: readTags, byteOrder} = Tags.read(dataView, tiffHeaderOffset, includeUnknown);\n if (readTags.Thumbnail) {\n tags.Thumbnail = readTags.Thumbnail;\n delete readTags.Thumbnail;\n }\n\n if (expanded) {\n tags.exif = readTags;\n addGpsGroup(tags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n\n if (Constants.USE_TIFF && Constants.USE_IPTC && readTags['IPTC-NAA'] && !hasIptcData(iptcDataOffset)) {\n const readIptcTags = IptcTags.read(readTags['IPTC-NAA'].value, 0, includeUnknown);\n if (expanded) {\n tags.iptc = readIptcTags;\n } else {\n tags = objectAssign({}, tags, readIptcTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_XMP && readTags['ApplicationNotes'] && !hasXmpData(xmpChunks)) {\n const readXmpTags = XmpTags.read(getStringValueFromArray(readTags['ApplicationNotes'].value));\n if (expanded) {\n tags.xmp = readXmpTags;\n } else {\n delete readXmpTags._raw;\n tags = objectAssign({}, tags, readXmpTags);\n }\n }\n\n if (Constants.USE_PHOTOSHOP && readTags['ImageSourceData']) {\n const readPhotoshopTags = PhotoshopTags.read(readTags['PhotoshopSettings'].value, includeUnknown);\n if (expanded) {\n tags.photoshop = readPhotoshopTags;\n } else {\n tags = objectAssign({}, tags, readPhotoshopTags);\n }\n }\n\n if (Constants.USE_TIFF && Constants.USE_ICC && readTags['ICC_Profile'] && !hasIccData(iccChunks)) {\n const readIccTags = IccTags.read(\n readTags['ICC_Profile'].value,\n [{\n offset: 0,\n length: readTags['ICC_Profile'].value.length,\n chunkNumber: 1,\n chunksTotal: 1\n }]\n );\n if (expanded) {\n tags.icc = readIccTags;\n } else {\n tags = objectAssign({}, tags, readIccTags);\n }\n }\n\n if (Constants.USE_MAKER_NOTES) {\n if (hasCanonData(readTags)) {\n const readCanonTags = CanonTags.read(dataView, tiffHeaderOffset, readTags['MakerNote'].__offset, byteOrder, includeUnknown);\n if (expanded) {\n tags.makerNotes = readCanonTags;\n } else {\n tags = objectAssign({}, tags, readCanonTags);\n }\n }\n }\n\n if (readTags['MakerNote']) {\n delete readTags['MakerNote'].__offset;\n }\n }\n\n if (Constants.USE_JPEG && Constants.USE_IPTC && hasIptcData(iptcDataOffset)) {\n foundMetaData = true;\n const readTags = IptcTags.read(dataView, iptcDataOffset, includeUnknown);\n if (expanded) {\n tags.iptc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_XMP && hasXmpData(xmpChunks)) {\n foundMetaData = true;\n const readTags = XmpTags.read(dataView, xmpChunks);\n if (expanded) {\n tags.xmp = readTags;\n } else {\n delete readTags._raw;\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if ((Constants.USE_JPEG || Constants.USE_WEBP) && Constants.USE_ICC && hasIccData(iccChunks)) {\n foundMetaData = true;\n const readTags = IccTags.read(dataView, iccChunks, async);\n if (readTags instanceof Promise) {\n tagsPromises.push(readTags.then(addIccTags));\n } else {\n addIccTags(readTags);\n }\n }\n\n if (Constants.USE_MPF && hasMpfData(mpfDataOffset)) {\n foundMetaData = true;\n const readMpfTags = MpfTags.read(dataView, mpfDataOffset, includeUnknown);\n if (expanded) {\n tags.mpf = readMpfTags;\n } else {\n tags = objectAssign({}, tags, readMpfTags);\n }\n }\n\n if (Constants.USE_PNG && Constants.USE_PNG_FILE && hasPngFileData(pngHeaderOffset)) {\n foundMetaData = true;\n const readTags = PngFileTags.read(dataView, pngHeaderOffset);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngFile = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_PNG && hasPngTextData(pngTextChunks)) {\n foundMetaData = true;\n const {readTags, readTagsPromise} = PngTextTags.read(dataView, pngTextChunks, async, includeUnknown);\n addPngTextTags(readTags);\n if (readTagsPromise) {\n tagsPromises.push(readTagsPromise.then((tagList) => tagList.forEach(addPngTextTags)));\n }\n }\n\n if (Constants.USE_PNG && hasPngData(pngChunkOffsets)) {\n foundMetaData = true;\n const readTags = PngTags.read(dataView, pngChunkOffsets);\n if (expanded) {\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_WEBP && hasVp8xData(vp8xChunkOffset)) {\n foundMetaData = true;\n const readTags = Vp8xTags.read(dataView, vp8xChunkOffset);\n if (expanded) {\n tags.riff = !tags.riff ? readTags : objectAssign({}, tags.riff, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n if (Constants.USE_GIF && hasGifFileData(gifHeaderOffset)) {\n foundMetaData = true;\n const readTags = GifFileTags.read(dataView, gifHeaderOffset);\n if (expanded) {\n tags.gif = !tags.gif ? readTags : objectAssign({}, tags.gif, readTags);\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n const thumbnail = (Constants.USE_JPEG || Constants.USE_WEBP)\n && Constants.USE_EXIF\n && Constants.USE_THUMBNAIL\n && Thumbnail.get(dataView, tags.Thumbnail, tiffHeaderOffset);\n if (thumbnail) {\n foundMetaData = true;\n tags.Thumbnail = thumbnail;\n } else {\n delete tags.Thumbnail;\n }\n\n if (fileType) {\n if (expanded) {\n if (!tags.file) {\n tags.file = {};\n }\n tags.file.FileType = fileType;\n } else {\n tags.FileType = fileType;\n }\n foundMetaData = true;\n }\n\n if (!foundMetaData) {\n throw new exifErrors.MetadataMissingError();\n }\n\n if (async) {\n return Promise.all(tagsPromises).then(() => tags);\n }\n return tags;\n\n function addIccTags(readTags) {\n if (expanded) {\n tags.icc = readTags;\n } else {\n tags = objectAssign({}, tags, readTags);\n }\n }\n\n function addPngTextTags(readTags) {\n if (expanded) {\n for (const group of ['exif', 'iptc']) {\n const groupKey = `__${group}`;\n if (readTags[groupKey]) {\n tags[group] = !tags[group] ? readTags[groupKey] : objectAssign({}, tags.exif, readTags[groupKey]);\n delete readTags[groupKey];\n }\n }\n tags.png = !tags.png ? readTags : objectAssign({}, tags.png, readTags);\n tags.pngText = !tags.pngText ? readTags : objectAssign({}, tags.png, readTags);\n } else {\n tags = objectAssign(\n {},\n tags,\n readTags.__exif ? readTags.__exif : {},\n readTags.__iptc ? readTags.__iptc : {},\n readTags\n );\n delete tags.__exif;\n delete tags.__iptc;\n }\n }\n}\n\nfunction hasFileData(fileDataOffset) {\n return fileDataOffset !== undefined;\n}\n\nfunction hasJfifData(jfifDataOffset) {\n return jfifDataOffset !== undefined;\n}\n\nfunction hasExifData(tiffHeaderOffset) {\n return tiffHeaderOffset !== undefined;\n}\n\nfunction addGpsGroup(tags) {\n if (tags.exif) {\n if (tags.exif.GPSLatitude && tags.exif.GPSLatitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Latitude = getCalculatedGpsValue(tags.exif.GPSLatitude.value);\n if (tags.exif.GPSLatitudeRef.value.join('') === 'S') {\n tags.gps.Latitude = -tags.gps.Latitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSLongitude && tags.exif.GPSLongitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Longitude = getCalculatedGpsValue(tags.exif.GPSLongitude.value);\n if (tags.exif.GPSLongitudeRef.value.join('') === 'W') {\n tags.gps.Longitude = -tags.gps.Longitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n\n if (tags.exif.GPSAltitude && tags.exif.GPSAltitudeRef) {\n try {\n tags.gps = tags.gps || {};\n tags.gps.Altitude = tags.exif.GPSAltitude.value[0] / tags.exif.GPSAltitude.value[1];\n if (tags.exif.GPSAltitudeRef.value === 1) {\n tags.gps.Altitude = -tags.gps.Altitude;\n }\n } catch (error) {\n // Ignore.\n }\n }\n }\n}\n\nfunction hasIptcData(iptcDataOffset) {\n return iptcDataOffset !== undefined;\n}\n\nfunction hasXmpData(xmpChunks) {\n return Array.isArray(xmpChunks) && xmpChunks.length > 0;\n}\n\nfunction hasIccData(iccDataOffsets) {\n return Array.isArray(iccDataOffsets) && iccDataOffsets.length > 0;\n}\n\nfunction hasCanonData(tags) {\n return tags['Make'] && tags['Make'].value && Array.isArray(tags['Make'].value) && tags['Make'].value[0] === 'Canon'\n && tags['MakerNote'] && tags['MakerNote'].__offset;\n}\n\nfunction hasMpfData(mpfDataOffset) {\n return mpfDataOffset !== undefined;\n}\n\nfunction hasPngFileData(pngFileDataOffset) {\n return pngFileDataOffset !== undefined;\n}\n\nfunction hasPngTextData(pngTextChunks) {\n return pngTextChunks !== undefined;\n}\n\nfunction hasPngData(pngChunkOffsets) {\n return pngChunkOffsets !== undefined;\n}\n\nfunction hasVp8xData(vp8xChunkOffset) {\n return vp8xChunkOffset !== undefined;\n}\n\nfunction hasGifFileData(gifHeaderOffset) {\n return gifHeaderOffset !== undefined;\n}\n"],"names":["DataView$1","buffer","bufferTypeIsUnsupported","offset","littleEndian","getDataView","data","byteOffset","byteLength","DataViewWrapper","getStringFromDataView","dataView","length","chars","getStringValueFromArray","getNullTerminatedStringFromDataView","i","char","getUnicodeStringFromDataView","getPascalStringFromDataView","size","string","charArray","charCode","objectAssign","property","deferInit","object","key","initializer","initialized","getBase64Image","image","byte","dataUriToBuffer","dataUri","decodedData","padStart","character","strRepeat","parseFloatRadix","radix","num","COMPRESSION_METHOD_NONE","COMPRESSION_METHOD_DEFLATE","decompress","compressionMethod","encoding","returnType","decompressionStream","decompressedStream","arrayBuffer","Constants","getStringValue","value","getEncodedString","getCalculatedGpsValue","LITTLE_ENDIAN","BIG_ENDIAN","ByteOrder","getByteOrder","tiffHeaderOffset","Tiff","isTiffFile","findTiffOffsets","hasTiffMarker","Jpeg","isJpegFile","findJpegOffsets","MIN_JPEG_DATA_BUFFER_LENGTH","JPEG_ID","JPEG_ID_SIZE","APP_ID_OFFSET","APP_MARKER_SIZE","JFIF_DATA_OFFSET","TIFF_HEADER_OFFSET","IPTC_DATA_OFFSET","XMP_DATA_OFFSET","XMP_EXTENDED_DATA_OFFSET","APP2_ICC_DATA_OFFSET","MPF_DATA_OFFSET","APP2_ICC_IDENTIFIER","ICC_CHUNK_NUMBER_OFFSET","ICC_TOTAL_CHUNKS_OFFSET","APP2_MPF_IDENTIFIER","SOF0_MARKER","SOF2_MARKER","DHT_MARKER","DQT_MARKER","DRI_MARKER","SOS_MARKER","APP0_MARKER","APP1_MARKER","APP2_MARKER","APP13_MARKER","APP15_MARKER","COMMENT_MARKER","FILL_BYTE","APP0_JFIF_IDENTIFIER","APP1_EXIF_IDENTIFIER","APP1_XMP_IDENTIFIER","APP1_XMP_EXTENDED_IDENTIFIER","APP13_IPTC_IDENTIFIER","appMarkerPosition","fieldLength","sof0DataOffset","sof2DataOffset","jfifDataOffset","iptcDataOffset","xmpChunks","iccChunks","mpfDataOffset","isSOF0Marker","isSOF2Marker","isApp0JfifMarker","isApp1ExifMarker","isApp1XmpMarker","getXmpChunkDetails","isApp1ExtendedXmpMarker","getExtendedXmpChunkDetails","isApp13PhotoshopMarker","isApp2ICCMarker","iccDataOffset","iccDataLength","iccChunkNumber","iccChunksTotal","isApp2MPFMarker","isAppMarker","isFillByte","markerIdLength","isXmpIdentifier","isExtendedXmpIdentifier","appMarker","Png","isPngFile","findPngOffsets","PNG_ID","PNG_CHUNK_LENGTH_SIZE","PNG_CHUNK_TYPE_SIZE","PNG_CHUNK_LENGTH_OFFSET","PNG_CHUNK_TYPE_OFFSET","PNG_CHUNK_DATA_OFFSET","PNG_XMP_PREFIX","TYPE_TEXT","TYPE_ITXT","TYPE_ZTXT","TYPE_PHYS","TYPE_TIME","TYPE_EXIF","TYPE_ICCP","async","offsets","isPngImageHeaderChunk","isPngXmpChunk","dataOffset","getPngXmpDataOffset","isPngTextChunk","chunkType","isPngExifChunk","isPngIccpChunk","chunkDataLength","iccHeaderOffset","profileName","compressedProfileOffset","parseIccHeader","isPngChunk","SUPPORTED_PNG_CHUNK_TYPES","numberOfNullSeparators","get64BitValue","parseItemLocationBox","version","contentOffset","boxLength","sizes","getItemLocationBoxOffsetsAndSizes","offsetSize","lengthSize","baseOffsetSize","indexSize","getIndexSize","itemCount","getItemCount","getItems","items","item","getItemId","getVariableSizedValue","j","extent","getExtentIndex","TYPE_FTYP","TYPE_IPRP","TYPE_META","TYPE_ILOC","TYPE_IINF","TYPE_INFE","TYPE_IPCO","TYPE_COLR","ITEM_INFO_TYPE_EXIF","ITEM_INFO_TYPE_MIME","ITEM_INFO_TYPE_URI","parseBox","getBoxLength","type","parseFileTypeBox","parseItemPropertiesBox","parseItemPropertyContainerBox","parseColorInformationBox","parseMetadataBox","parseItemInformationBox","parseItemInformationEntryBox","extendsToEndOfFile","hasExtendedSize","hasEmptyHighBits","findOffsets","metaBox","findMetaBox","findExifOffset","findXmpChunks","findIccChunks","box","exifItemId","findIinfExifItemId","ilocItem","findIlocItem","exifOffset","getTiffHeaderOffset","itemInfo","itemId","xmpItemId","findIinfXmpItemId","ilocItemExtent","icc","startOffset","parseSubBoxes","parseIcc","colorType","ACCEPTED_ITEM_INFO_TYPES","subBoxes","currentOffset","getItemInformationBoxOffsetsAndSizes","entry","Heic","isHeicFile","findHeicOffsets","HEIC_MAJOR_BRANDS","headerBox","Avif","isAvifFile","findAvifOffsets","Webp","isWebpFile","RIFF_ID","WEBP_MARKER","EXIF_IDENTIFIER","hasAppMarkers","vp8xChunkOffset","chunkId","chunkSize","Gif","isGifFile","GIF_SIGNATURE_SIZE","GIF_SIGNATURES","Xml","isXMLFile","XML_MARKER_OFFSET","XML_MARKER","ImageHeader","parseAppMarkers","addFileType","fileType","fileTypeDescription","TagNamesCommon","decimal","denominator","TagNames0thIfd","values","formats","sample","decodeXPValue","TagNamesExifIfd","x","y","focalLengthFrom","focalLengthTo","focalLengths","maxAperture","TagNamesGpsIfd","ref","numerator","status","mode","TagNamesInteroperabilityIfd","TagNamesMpfIfd","TagNamesCanonIfd","tagNames0thExifIfds","IFD_TYPE_0TH","IFD_TYPE_1ST","IFD_TYPE_EXIF","IFD_TYPE_GPS","IFD_TYPE_INTEROPERABILITY","IFD_TYPE_MPF","IFD_TYPE_CANON","TagNames$1","typeSizes","tagTypes","Types","getAsciiValue","getByteAt","getAsciiAt","getShortAt","getLongAt","getRationalAt","getUndefinedAt","getSlongAt","getSrationalAt","getIfdPointerAt","getTypeSize","byteOrder","typeName","getTagValueAt","get0thIfdOffset","readIfd","ifdType","includeUnknown","FIELD_COUNT_SIZE","FIELD_SIZE","tags","numberOfFields","getNumberOfFields","fieldIndex","tag","readTag","nextIfdOffset","TAG_TYPE_OFFSET","TAG_COUNT_OFFSET","TAG_VALUE_OFFSET","tagCode","tagType","tagCount","tagValue","tagValueOffset","TagNames","tagValueFitsInOffsetSlot","getTagValue","tagValueFitsInDataView","forceByteType","splitNullSeparatedAsciiString","decodeAsciiValue","tagName","tagDescription","getDescriptionFromTagValue","count","valueIndex","asciiValue","EXIF_IFD_POINTER_KEY","GPS_INFO_IFD_POINTER_KEY","INTEROPERABILITY_IFD_POINTER_KEY","Tags","read","read0thIfd","readExifIfd","readGpsIfd","readInteroperabilityIfd","MpfTags","ENTRY_SIZE","addMpfImages","images","attributes","getImageNumberValue","getImageFlags","getImageFormat","getImageType","imageSize","imageOffset","getImageOffset","dependentImage1EntryNumber","dependentImage2EntryNumber","entries","flags","flagsDescription","imageFormat","imageIndex","mpEntry","isFirstIndividualImage","FileTags","fileDataOffset","getLength","numberOfColorComponents","getNumberOfColorComponents","getDataPrecision","getImageHeight","getImageWidth","getSubsampling","components","componentOffset","getComponentIds","getSamplingType","ids","compontent","types","JfifTags","thumbnailWidth","getThumbnailWidth","thumbnailHeight","getThumbnailHeight","getVersion","getResolutionUnit","getXResolution","getYResolution","thumbnail","getThumbnail","majorVersion","minorVersion","getResolutionUnitDescription","thumbnailLength","IptcTagNames","getCreationDate","getCreationTime","getEncodingName","parts","stringValue","character0","character1","description","bits","duration","intValue","formatVersions","objectDataPreviewFileFormat","n","date","time","parsedTime","TextDecoder$1","get","TAG_HEADER_SIZE","TagDecoder","decode","Decoder","TextDecoder","BYTES_8BIM","BYTES_8BIM_SIZE","RESOURCE_ID_SIZE","RESOURCE_NAME_SIZE_SIZE","RESOURCE_NAME_MIN_SIZE","RESOURCE_SIZE_SIZE","RESOURCE_BLOCK_MIN_HEADER_SIZE","NAA_RESOURCE_BLOCK_TYPE","IptcTags","parseTags","naaBlock","newDataOffset","getNaaResourceBlock","resourceBlock","getResourceBlock","isNaaResourceBlock","getBlockPadding","resourceNameSize","resourceNameTotalSize","endOfBlockOffset","tagSize","leadByteIsMissing","getTagName","getTagDescription","tagIsRepeatable","tagContainsEncoding","tagIsName","hasDynamicName","hasDescriptionProperty","tagValueIsText","XmpTagNames","fraction","calculateGPSValue","parseNumber","numbers","number","isFraction","func","degreesString","minutesString","degrees","minutes","DOMParser$1","DOMParser","onErrorStopParsing","XmpTags","chunks","readTags","standardXmp","extendedXmp","extractCompleteChunks","hasStandardTags","hasExtendedTags","combineChunks","completeChunks","totalLength","chunk","combinedChunks","slice","chunkDataView","doc","raw","getDocument","rdf","getRDF","parseXMPObject","convertToObject","domParser","xmlString","trimXmlSource","xmlSource","node","isTopNode","childNodes","getChildNodes","hasTextOnlyContent","getTextValue","getElementsFromNodes","elements","nodes","isElement","nodeElement","getElementFromNode","getAttributes","element","xmpObject","nodeName","parseNodeAttributesAsTags","parseNodeChildrenAsTags","name","isTagAttribute","getLocalName","getDescription","isNamespaceDefinition","arrayDescription","getDescriptionOfArray","getDescriptionOfObject","descriptions","getClearTextKey","children","parseNodeAsTag","isDuplicateTag","parseNodeAsDuplicateTag","isEmptyResourceTag","hasNestedSimpleRdfDescription","parseNodeAsSimpleRdfDescription","hasNestedStructureRdfDescription","parseNodeAsStructureRdfDescription","isCompactStructure","parseNodeAsCompactStructure","isArray","parseNodeAsArray","parseNodeAsSimpleValue","parseNodeAttributes","parseNodeChildrenAsAttributes","parseRdfValue","getURIValue","getArrayChild","parseArrayValue","PathRecordTypes","PATH_RECORD_SIZE","pathResource","paths","PATH_RECORD_TYPES","parseBezierKnot","parseClipboard","path","parsePathPoint","vertical","getFixedPointNumber","binaryPoint","sign","integer","PhotoshopTags","SIGNATURE","TAG_ID_SIZE","RESOURCE_LENGTH_SIZE","SIGNATURE_SIZE","bytes","signature","tagId","tagNameSize","resourceSize","valueDataView","stringSize","iccTags","iccProfile","toCompany","parseDate","sliceToString","year","month","day","hours","seconds","IccTags","PROFILE_HEADER_LENGTH","ICC_TAG_COUNT_OFFSET","ICC_SIGNATURE","TAG_TYPE_DESC","TAG_TYPE_MULTI_LOCALIZED_UNICODE_TYPE","TAG_TYPE_TEXT","TAG_TYPE_SIGNATURE","TAG_TABLE_SINGLE_TAG_DATA","iccData","readCompressedIcc","readIcc","compressionMethodIsSupported","compressedDataView","totalIccProfileLength","sum","iccBinaryData","getBuffer","chunkNumber","iccDataChunk","chunkData","iccDoesNotHaveTagCount","hasTagsData","tagHeaderOffset","iccProfileKeys","profileEntry","tagSignature","tagOffset","tagValueSize","val","addTag","numRecords","recordSize","recordNum","languageCode","countryCode","textLength","textOffset","text","valObj","valIndex","SHOT_INFO_AUTO_ROTATE","CanonTags","parseShotInfo","shotInfoData","getAutoRotateDescription","autoRotate","PngFileTags","getBitDepth","getColorType","getCompression","getFilter","getInterlace","COLOR_TYPES","INTERLACE_TYPES","PngTextTags","STATE_KEYWORD","STATE_COMPRESSION","STATE_LANG","STATE_TRANSLATED_KEYWORD","STATE_TEXT","COMPRESSION_SECTION_ITXT_EXTRA_BYTE","COMPRESSION_FLAG_COMPRESSED","EXIF_OFFSET","pngTextChunks","tagsPromises","nameAndValue","getNameAndValue","isExifGroupTag","decodeRawData","isIptcGroupTag","keywordChars","langChars","valueChars","parsingState","getCompressionMethod","moveToNextState","decompressedValueChars","getEncodingFromType","_decompressedValueChars","constructTag","getValue","getName","lang","hexToDataView","hex","PngTags","chunkOffsets","chunkLength","getPixelsPerUnitX","getPixelsPerUnitY","getPixelUnits","getModifyDate","chunkOffset","tagFitsInBuffer","pad","Vp8xTags","IMAGE_WIDTH_OFFSET","IMAGE_HEIGHT_OFFSET","getAlpha","getAnimation","getThreeByteValue","GifFileTags","getGifVersion","getGlobalColorMap","getColorResolution","COMPRESSION_JPEG","Thumbnail","thumbnailTags","hasJpegThumbnail","MetadataMissingError","message","exifErrors","ExifReader","load","loadView","options","isFilePathOrURL","loadFile","fileContents","loadFromData","isBrowserFileObject","loadFileObject","filename","fetchRemoteFile","nodeGetRemoteFile","isDataUri","loadLocalFile","url","response","resolve","reject","requireNodeGet","error","fs","requireNodeFs","fd","stat","file","reader","readerEvent","isNodeBuffer","expanded","foundMetaData","pngHeaderOffset","pngChunkOffsets","gifHeaderOffset","hasFileData","hasJfifData","hasExifData","addGpsGroup","hasIptcData","readIptcTags","hasXmpData","readXmpTags","readPhotoshopTags","hasIccData","readIccTags","hasCanonData","readCanonTags","addIccTags","hasMpfData","readMpfTags","hasPngFileData","hasPngTextData","readTagsPromise","addPngTextTags","tagList","hasPngData","hasVp8xData","hasGifFileData","group","groupKey","iccDataOffsets","pngFileDataOffset"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]}