diff --git a/README.md b/README.md index 64572d4a..4c60e1ed 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ of Ashampoo Photos, which, in turn, is driven by user community feedback. ## Installation ``` -implementation("com.ashampoo:kim:0.8.1") +implementation("com.ashampoo:kim:0.8.2") ``` ## Sample usages diff --git a/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegConstants.kt b/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegConstants.kt index 277006d9..5091aa13 100644 --- a/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegConstants.kt +++ b/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegConstants.kt @@ -91,6 +91,7 @@ object JpegConstants { const val JPEG_APP0 = 0xE0 const val JPEG_APP0_MARKER = 0xFF00 or JPEG_APP0 const val JPEG_APP1_MARKER = 0xFF00 or JPEG_APP0 + 1 + const val JPEG_APP2_MARKER = 0xFF00 or JPEG_APP0 + 2 const val JPEG_APP13_MARKER = 0xFF00 or JPEG_APP0 + 13 const val JPEG_APP15_MARKER = 0xFF00 or JPEG_APP0 + 15 @@ -114,7 +115,7 @@ object JpegConstants { const val SOF15_MARKER = 0xFFC0 + 0xF // marker for restart intervals - const val DRI_MARKER = 0xFFdd + const val DRI_MARKER = 0xFFDD const val RST0_MARKER = 0xFFD0 const val RST1_MARKER = 0xFFD0 + 0x1 const val RST2_MARKER = 0xFFD0 + 0x2 @@ -124,11 +125,14 @@ object JpegConstants { const val RST6_MARKER = 0xFFD0 + 0x6 const val RST7_MARKER = 0xFFD0 + 0x7 + const val SOI_MARKER = 0xFFD8 const val EOI_MARKER = 0xFFD9 const val SOS_MARKER = 0xFFDA const val DQT_MARKER = 0xFFDB const val DNL_MARKER = 0xFFDC - const val COM_MARKER = 0xFFFE + + const val COM_MARKER_1 = 0xFFFE + const val COM_MARKER_2 = 0xFFEE val SOFN_MARKERS = listOf( JpegConstants.SOF0_MARKER, @@ -146,6 +150,27 @@ object JpegConstants { JpegConstants.SOF15_MARKER ) + @OptIn(ExperimentalStdlibApi::class) + fun markerDescription(marker: Int): String = + when (marker) { + COM_MARKER_1 -> "COM (Comment)" + COM_MARKER_2 -> "COM (Comment)" + DHT_MARKER -> "DHT (Define Huffman Table)" + DQT_MARKER -> "DQT (Define Quantization Table)" + DRI_MARKER -> "DRI (Define Restart Interval)" + EOI_MARKER -> "EOI (End of Image)" + JPEG_APP0_MARKER -> "APP0 JFIF" + JPEG_APP1_MARKER -> "APP1" + JPEG_APP2_MARKER -> "APP2" + JPEG_APP13_MARKER -> "APP13 IPTC" + JPEG_APP15_MARKER -> "APP15" + SOF0_MARKER -> "SOF0 (Start of Frame, Baseline DCT)" + SOF2_MARKER -> "SOF2 (Start of Frame, Progressive DCT)" + SOI_MARKER -> "SOI (Start of Image)" + SOS_MARKER -> "SOS (Start of Scan)" + else -> marker.toShort().toHexString(HexFormat.UpperCase) + } + // val MARKERS = listOf( // JPEG_APP0, JPEG_APP0_MARKER, // JPEG_APP1_MARKER, JPEG_APP2_MARKER, JPEG_APP13_MARKER, diff --git a/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegOrientationOffsetFinder.kt b/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegOrientationOffsetFinder.kt index c8cc18a3..cf14259f 100644 --- a/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegOrientationOffsetFinder.kt +++ b/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegOrientationOffsetFinder.kt @@ -21,6 +21,9 @@ import com.ashampoo.kim.common.toSingleNumberHexes import com.ashampoo.kim.common.tryWithImageReadException import com.ashampoo.kim.format.ImageFormatMagicNumbers import com.ashampoo.kim.format.jpeg.JpegConstants.JPEG_BYTE_ORDER +import com.ashampoo.kim.format.jpeg.JpegMetadataExtractor.MARKER_END_OF_IMAGE +import com.ashampoo.kim.format.jpeg.JpegMetadataExtractor.SEGMENT_IDENTIFIER +import com.ashampoo.kim.format.jpeg.JpegMetadataExtractor.SEGMENT_START_OF_SCAN import com.ashampoo.kim.format.tiff.TiffReader import com.ashampoo.kim.format.tiff.constants.TiffConstants.TIFF_ENTRY_LENGTH import com.ashampoo.kim.format.tiff.constants.TiffConstants.TIFF_HEADER_SIZE @@ -33,9 +36,6 @@ import com.ashampoo.kim.input.ByteReader */ object JpegOrientationOffsetFinder { - const val SEGMENT_IDENTIFIER = 0xFF.toByte() - const val SEGMENT_START_OF_SCAN = 0xDA.toByte() - const val MARKER_END_OF_IMAGE = 0xD9.toByte() const val APP1_MARKER = 0xE1.toByte() @OptIn(ExperimentalStdlibApi::class) diff --git a/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegSegmentAnalyzer.kt b/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegSegmentAnalyzer.kt new file mode 100644 index 00000000..3bd0f527 --- /dev/null +++ b/src/commonMain/kotlin/com/ashampoo/kim/format/jpeg/JpegSegmentAnalyzer.kt @@ -0,0 +1,158 @@ +/* + * Copyright 2023 Ashampoo GmbH & Co. KG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ashampoo.kim.format.jpeg + +import com.ashampoo.kim.common.ImageReadException +import com.ashampoo.kim.common.toSingleNumberHexes +import com.ashampoo.kim.common.toUInt16 +import com.ashampoo.kim.common.tryWithImageReadException +import com.ashampoo.kim.format.ImageFormatMagicNumbers +import com.ashampoo.kim.format.jpeg.JpegConstants.EOI_MARKER +import com.ashampoo.kim.format.jpeg.JpegConstants.JPEG_APP1_MARKER +import com.ashampoo.kim.format.jpeg.JpegConstants.JPEG_BYTE_ORDER +import com.ashampoo.kim.format.jpeg.JpegConstants.SOI_MARKER +import com.ashampoo.kim.format.jpeg.JpegConstants.markerDescription +import com.ashampoo.kim.format.jpeg.JpegMetadataExtractor.SEGMENT_IDENTIFIER +import com.ashampoo.kim.format.jpeg.JpegMetadataExtractor.SEGMENT_START_OF_SCAN +import com.ashampoo.kim.input.ByteReader + +/** + * Algorithm to find segment offsets, types and lengths + */ +object JpegSegmentAnalyzer { + + @OptIn(ExperimentalStdlibApi::class) + @Throws(ImageReadException::class) + @Suppress("ComplexMethod") + fun findSegmentInfos( + byteReader: ByteReader + ): List = tryWithImageReadException { + + val soiMarker = byteReader.read2BytesAsInt("SOI", JPEG_BYTE_ORDER) + + require(soiMarker == SOI_MARKER) { + "JPEG magic number mismatch: ${soiMarker.toHexString()}" + } + + val segmentInfos = mutableListOf() + + segmentInfos.add( + JpegSegmentInfo( + offset = 0, + marker = SOI_MARKER, + length = 2 + ) + ) + + var positionCounter: Long = ImageFormatMagicNumbers.jpeg.size.toLong() + + @Suppress("LoopWithTooManyJumpStatements") + do { + + var segmentIdentifier = byteReader.readByte() ?: break + var segmentType = byteReader.readByte() ?: break + + positionCounter += 2 + + /* + * Find the segment marker. Markers are zero or more 0xFF bytes, followed by + * a 0xFF and then a byte not equal to 0x00 or 0xFF. + */ + while ( + segmentIdentifier != SEGMENT_IDENTIFIER || + segmentType == SEGMENT_IDENTIFIER || + segmentType.toInt() == 0 + ) { + + segmentIdentifier = segmentType + + val nextSegmentType = byteReader.readByte() ?: break + + positionCounter++ + + segmentType = nextSegmentType + } + + if (segmentType == SEGMENT_START_OF_SCAN) { + + val remainingBytesCount = byteReader.contentLength - positionCounter + + segmentInfos.add( + JpegSegmentInfo( + offset = positionCounter - 2, + marker = byteArrayOf(segmentIdentifier, segmentType).toUInt16(JPEG_BYTE_ORDER), + length = remainingBytesCount.toInt() + ) + ) + + byteReader.skipBytes("image bytes", remainingBytesCount - 2) + + positionCounter += remainingBytesCount + + val eoiMarker = byteReader.read2BytesAsInt("EOI", JPEG_BYTE_ORDER) + + if (eoiMarker == EOI_MARKER) { + + /* Write the EOI marker if it's really there. */ + + segmentInfos.add( + JpegSegmentInfo( + offset = positionCounter - 2, + marker = EOI_MARKER, + length = 2 + ) + ) + } + + break + } + + /* Note: Segment length includes size bytes */ + val remainingSegmentLength = + byteReader.read2BytesAsInt("segmentLength", JPEG_BYTE_ORDER) - 2 + + segmentInfos.add( + JpegSegmentInfo( + offset = positionCounter - 2, + marker = byteArrayOf(segmentIdentifier, segmentType).toUInt16(JPEG_BYTE_ORDER), + length = remainingSegmentLength + 4 + ) + ) + + positionCounter += 2 + + if (remainingSegmentLength <= 0) + throw ImageReadException("Illegal JPEG segment length: $remainingSegmentLength") + + byteReader.skipBytes("skip segment", remainingSegmentLength.toLong()) + + positionCounter += remainingSegmentLength + + } while (true) + + return segmentInfos + } + + data class JpegSegmentInfo( + val offset: Long, + val marker: Int, + val length: Int + ) { + + override fun toString(): String = + "$offset = ${markerDescription(marker)} [$length bytes]" + } +} diff --git a/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/TiffField.kt b/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/TiffField.kt index 1f3e677a..b938ef1a 100644 --- a/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/TiffField.kt +++ b/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/TiffField.kt @@ -17,6 +17,7 @@ package com.ashampoo.kim.format.tiff import com.ashampoo.kim.common.ByteOrder +import com.ashampoo.kim.common.HEX_RADIX import com.ashampoo.kim.common.ImageReadException import com.ashampoo.kim.common.RationalNumber import com.ashampoo.kim.common.head @@ -40,6 +41,10 @@ class TiffField( val sortHint: Int ) { + /** Return a proper Tag ID like 0x0100 */ + val tagFormatted: String = + "0x" + tag.toString(HEX_RADIX).padStart(4, '0') + val tagInfo: TagInfo = getTag(directoryType, tag) val isLocalValue: Boolean = count * fieldType.size <= TiffConstants.TIFF_ENTRY_MAX_VALUE_LENGTH @@ -142,8 +147,12 @@ class TiffField( else (value as Number).toDouble() + /* + * Note that we need to show the local 'tagFormatted', because + * 'tagInfo' might be an Unknown tag and show a placeholder. + */ override fun toString(): String = - "${tagInfo.description} = $valueDescription" + "$tagFormatted ${tagInfo.name} = $valueDescription" fun createOversizeValueElement(): TiffElement? = if (isLocalValue) null else OversizeValueElement(offset.toInt(), valueBytes.size) diff --git a/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/constants/ExifTag.kt b/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/constants/ExifTag.kt index 68750abb..b9829c29 100644 --- a/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/constants/ExifTag.kt +++ b/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/constants/ExifTag.kt @@ -55,6 +55,16 @@ object ExifTag { TiffDirectoryType.EXIF_DIRECTORY_INTEROP_IFD ) + val EXIF_TAG_INTEROPERABILITY_RELATED_IMAGE_WIDTH = TagInfoShort( + "RelatedImageWidth", 0x1001, + TiffDirectoryType.EXIF_DIRECTORY_INTEROP_IFD + ) + + val EXIF_TAG_INTEROPERABILITY_RELATED_IMAGE_HEIGHT = TagInfoShort( + "RelatedImageHeight", 0x1002, + TiffDirectoryType.EXIF_DIRECTORY_INTEROP_IFD + ) + val EXIF_TAG_PROCESSING_SOFTWARE = TagInfoAscii( "ProcessingSoftware", 0x000b, -1, TIFF_DIRECTORY_IFD0 @@ -501,6 +511,11 @@ object ExifTag { TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD ) + val EXIF_TAG_OFFSET_TIME = TagInfoAscii( + "OffsetTime", 0x9010, -1, + TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD + ) + val EXIF_TAG_OFFSET_TIME_ORIGINAL = TagInfoAscii( "OffsetTimeOriginal", 0x9011, -1, TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD @@ -883,8 +898,37 @@ object ExifTag { TiffDirectoryType.EXIF_DIRECTORY_EXIF_IFD ) + val EXIF_TAG_ICC_PROFILE_OFFSET = TagInfoUndefined( + "ICC_Profile", 0x8773, + TIFF_DIRECTORY_IFD0 + ) + + /* Affinity Photo creates it's own tag with custom data. */ + val EXIF_TAG_AFFINITY_PHOTO_OFFSET = TagInfoUndefined( + "AffinityPhoto", 0xC7E0, + TIFF_DIRECTORY_IFD0 + ) + + /* + * Page 18 of the XMPSpecificationPart1.pdf: + * When XMP is embedded within digital files, including white-space padding + * is sometimes helpful. Doing so facilitates modification of the XMP packet + * in-place. The rest of the file is unaffected, which could eliminate a need + * to rewrite the entire file if the XMP changes in size. Appropriate padding + * is SPACE characters placed anywhere white space is allowed by the general + * XML syntax and XMP serialization rules, with a linefeed (U+000A) every + * 100 characters or so to improve human display. The amount of padding is + * workflow-dependent; around 2000 bytes is often a reasonable amount. + */ + val EXIF_TAG_PADDING = TagInfoUndefined( + "Padding", 0xEA1C, + TIFF_DIRECTORY_IFD0 + ) + val ALL_EXIF_TAGS = listOf( EXIF_TAG_INTEROPERABILITY_INDEX, EXIF_TAG_INTEROPERABILITY_VERSION, + EXIF_TAG_INTEROPERABILITY_RELATED_IMAGE_WIDTH, + EXIF_TAG_INTEROPERABILITY_RELATED_IMAGE_HEIGHT, EXIF_TAG_PROCESSING_SOFTWARE, EXIF_TAG_SOFTWARE, EXIF_TAG_PREVIEW_IMAGE_START_IFD0, @@ -938,7 +982,7 @@ object ExifTag { EXIF_TAG_SUBJECT_AREA, EXIF_TAG_STO_NITS, EXIF_TAG_SUB_SEC_TIME, EXIF_TAG_SUB_SEC_TIME_ORIGINAL, EXIF_TAG_SUB_SEC_TIME_DIGITIZED, - EXIF_TAG_OFFSET_TIME_ORIGINAL, + EXIF_TAG_OFFSET_TIME, EXIF_TAG_OFFSET_TIME_ORIGINAL, EXIF_TAG_FLASHPIX_VERSION, EXIF_TAG_EXIF_IMAGE_WIDTH, EXIF_TAG_EXIF_IMAGE_LENGTH, EXIF_TAG_RELATED_SOUND_FILE, EXIF_TAG_INTEROP_OFFSET, @@ -968,6 +1012,8 @@ object ExifTag { EXIF_TAG_MOIRE_FILTER, EXIF_TAG_USER_COMMENT, EXIF_TAG_MAKER_NOTE, EXIF_TAG_RATING, EXIF_TAG_RATING_PERCENT, EXIF_TAG_SUB_IFDS_OFFSET, EXIF_TAG_MODIFY_DATE, EXIF_TAG_SENSITIVITY_TYPE, - EXIF_TAG_RECOMMENDED_EXPOSURE_INDEX, EXIF_TAG_COLOR_SPACE + EXIF_TAG_RECOMMENDED_EXPOSURE_INDEX, EXIF_TAG_COLOR_SPACE, + EXIF_TAG_ICC_PROFILE_OFFSET, EXIF_TAG_AFFINITY_PHOTO_OFFSET, + EXIF_TAG_PADDING ) } diff --git a/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/taginfos/TagInfo.kt b/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/taginfos/TagInfo.kt index 8ec7d558..d813bef9 100644 --- a/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/taginfos/TagInfo.kt +++ b/src/commonMain/kotlin/com/ashampoo/kim/format/tiff/taginfos/TagInfo.kt @@ -50,6 +50,9 @@ open class TagInfo( /** * @param entry the TIFF field whose value to return * @return the value of the TIFF field + * + * Implementation detail: This indirection exists because + * [TagInfoGpsText] has some special logic to interpret the value. */ open fun getValue(entry: TiffField): Any = entry.fieldType.getValue(entry) diff --git a/src/commonTest/kotlin/com/ashampoo/kim/format/jpeg/JpegSegmentAnalyzerTest.kt b/src/commonTest/kotlin/com/ashampoo/kim/format/jpeg/JpegSegmentAnalyzerTest.kt new file mode 100644 index 00000000..f92c55a7 --- /dev/null +++ b/src/commonTest/kotlin/com/ashampoo/kim/format/jpeg/JpegSegmentAnalyzerTest.kt @@ -0,0 +1,875 @@ +/* + * Copyright 2023 Ashampoo GmbH & Co. KG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ashampoo.kim.format.jpeg + +import com.ashampoo.kim.common.toUInt16 +import com.ashampoo.kim.format.jpeg.JpegConstants.JPEG_BYTE_ORDER +import com.ashampoo.kim.input.ByteArrayByteReader +import com.ashampoo.kim.testdata.KimTestData +import kotlin.test.Test +import kotlin.test.assertEquals + +class JpegSegmentAnalyzerTest { + + val expectedMap = mapOf>( + 1 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 6650), + JpegSegmentAnalyzer.JpegSegmentInfo(6670, 65517, 148), + JpegSegmentAnalyzer.JpegSegmentInfo(6818, 65505, 11019), + JpegSegmentAnalyzer.JpegSegmentInfo(17837, 65506, 8958), + JpegSegmentAnalyzer.JpegSegmentInfo(26795, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(26864, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(26933, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(26952, 65476, 32), + JpegSegmentAnalyzer.JpegSegmentInfo(26984, 65476, 83), + JpegSegmentAnalyzer.JpegSegmentInfo(27067, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(27098, 65476, 73), + JpegSegmentAnalyzer.JpegSegmentInfo(27171, 65498, 3938708), + JpegSegmentAnalyzer.JpegSegmentInfo(3965879, 65497, 2), + ), + 2 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 10828), + JpegSegmentAnalyzer.JpegSegmentInfo(10848, 65506, 690), + JpegSegmentAnalyzer.JpegSegmentInfo(11538, 65517, 210), + JpegSegmentAnalyzer.JpegSegmentInfo(11748, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(11817, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(11886, 65474, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(11905, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(11936, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(11964, 65498, 651073), + JpegSegmentAnalyzer.JpegSegmentInfo(663037, 65497, 2), + ), + 3 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 13010), + JpegSegmentAnalyzer.JpegSegmentInfo(13012, 65517, 12292), + JpegSegmentAnalyzer.JpegSegmentInfo(25304, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(28466, 65505, 28164), + JpegSegmentAnalyzer.JpegSegmentInfo(56630, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(56646, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(56715, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(56784, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(56803, 65476, 33), + JpegSegmentAnalyzer.JpegSegmentInfo(56836, 65476, 90), + JpegSegmentAnalyzer.JpegSegmentInfo(56926, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(56957, 65476, 58), + JpegSegmentAnalyzer.JpegSegmentInfo(57015, 65498, 948898), + JpegSegmentAnalyzer.JpegSegmentInfo(1005913, 65497, 2), + ), + 4 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 8670), + JpegSegmentAnalyzer.JpegSegmentInfo(8672, 65517, 8052), + JpegSegmentAnalyzer.JpegSegmentInfo(16724, 65506, 566), + JpegSegmentAnalyzer.JpegSegmentInfo(17290, 65505, 14667), + JpegSegmentAnalyzer.JpegSegmentInfo(31957, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(32091, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(32097, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(32113, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(32132, 65476, 154), + JpegSegmentAnalyzer.JpegSegmentInfo(32286, 65498, 1170231), + JpegSegmentAnalyzer.JpegSegmentInfo(1202517, 65497, 2), + ), + 5 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 13494), + JpegSegmentAnalyzer.JpegSegmentInfo(13496, 65517, 12740), + JpegSegmentAnalyzer.JpegSegmentInfo(26236, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(29398, 65505, 16372), + JpegSegmentAnalyzer.JpegSegmentInfo(45770, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(45786, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(45840, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(45909, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(45978, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(45997, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(46027, 65476, 78), + JpegSegmentAnalyzer.JpegSegmentInfo(46105, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(46133, 65476, 45), + JpegSegmentAnalyzer.JpegSegmentInfo(46178, 65498, 1143108), + JpegSegmentAnalyzer.JpegSegmentInfo(1189286, 65497, 2), + ), + 6 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 12186), + JpegSegmentAnalyzer.JpegSegmentInfo(12188, 65517, 11592), + JpegSegmentAnalyzer.JpegSegmentInfo(23780, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(26942, 65505, 13232), + JpegSegmentAnalyzer.JpegSegmentInfo(40174, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(40190, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(40259, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(40328, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(40347, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(40378, 65476, 97), + JpegSegmentAnalyzer.JpegSegmentInfo(40475, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(40506, 65476, 72), + JpegSegmentAnalyzer.JpegSegmentInfo(40578, 65498, 1151436), + JpegSegmentAnalyzer.JpegSegmentInfo(1192014, 65497, 2), + ), + 7 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 9384), + JpegSegmentAnalyzer.JpegSegmentInfo(9386, 65517, 8900), + JpegSegmentAnalyzer.JpegSegmentInfo(18286, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(21448, 65505, 18592), + JpegSegmentAnalyzer.JpegSegmentInfo(40040, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(40056, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(40190, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(40209, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(40215, 65476, 420), + JpegSegmentAnalyzer.JpegSegmentInfo(40635, 65498, 1095574), + JpegSegmentAnalyzer.JpegSegmentInfo(1136209, 65497, 2), + ), + 8 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 14498), + JpegSegmentAnalyzer.JpegSegmentInfo(14500, 65517, 13832), + JpegSegmentAnalyzer.JpegSegmentInfo(28332, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(31494, 65505, 13428), + JpegSegmentAnalyzer.JpegSegmentInfo(44922, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(45056, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(45062, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(45078, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(45097, 65476, 173), + JpegSegmentAnalyzer.JpegSegmentInfo(45270, 65498, 1193722), + JpegSegmentAnalyzer.JpegSegmentInfo(1238992, 65497, 2), + ), + 9 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 1038), + JpegSegmentAnalyzer.JpegSegmentInfo(1040, 65517, 252), + JpegSegmentAnalyzer.JpegSegmentInfo(1292, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(4454, 65505, 17364), + JpegSegmentAnalyzer.JpegSegmentInfo(21818, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(21952, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(21958, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(21974, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(21993, 65476, 171), + JpegSegmentAnalyzer.JpegSegmentInfo(22164, 65498, 206956), + JpegSegmentAnalyzer.JpegSegmentInfo(229120, 65497, 2), + ), + 10 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 15900), + JpegSegmentAnalyzer.JpegSegmentInfo(15902, 65517, 15200), + JpegSegmentAnalyzer.JpegSegmentInfo(31102, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(34264, 65505, 13675), + JpegSegmentAnalyzer.JpegSegmentInfo(47939, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(47955, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(48009, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(48078, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(48147, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(48166, 65476, 32), + JpegSegmentAnalyzer.JpegSegmentInfo(48198, 65476, 99), + JpegSegmentAnalyzer.JpegSegmentInfo(48297, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(48327, 65476, 58), + JpegSegmentAnalyzer.JpegSegmentInfo(48385, 65498, 1341725), + JpegSegmentAnalyzer.JpegSegmentInfo(1390110, 65497, 2), + ), + 11 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 832), + JpegSegmentAnalyzer.JpegSegmentInfo(834, 65517, 150), + JpegSegmentAnalyzer.JpegSegmentInfo(984, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(4146, 65505, 5942), + JpegSegmentAnalyzer.JpegSegmentInfo(10088, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(10104, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(10158, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(10227, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(10296, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(10315, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(10346, 65476, 79), + JpegSegmentAnalyzer.JpegSegmentInfo(10425, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(10455, 65476, 58), + JpegSegmentAnalyzer.JpegSegmentInfo(10513, 65498, 1542294), + JpegSegmentAnalyzer.JpegSegmentInfo(1552807, 65497, 2), + ), + 12 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 12914), + JpegSegmentAnalyzer.JpegSegmentInfo(12916, 65517, 12294), + JpegSegmentAnalyzer.JpegSegmentInfo(25210, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(28372, 65505, 14097), + JpegSegmentAnalyzer.JpegSegmentInfo(42469, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(42485, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(42554, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(42623, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(42642, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(42672, 65476, 80), + JpegSegmentAnalyzer.JpegSegmentInfo(42752, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(42781, 65476, 51), + JpegSegmentAnalyzer.JpegSegmentInfo(42832, 65498, 1148049), + JpegSegmentAnalyzer.JpegSegmentInfo(1190881, 65497, 2), + ), + 13 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 214), + JpegSegmentAnalyzer.JpegSegmentInfo(234, 65517, 162), + JpegSegmentAnalyzer.JpegSegmentInfo(396, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(3210, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(3279, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(3348, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(3367, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(3397, 65476, 79), + JpegSegmentAnalyzer.JpegSegmentInfo(3476, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(3505, 65476, 58), + JpegSegmentAnalyzer.JpegSegmentInfo(3563, 65498, 1049051), + JpegSegmentAnalyzer.JpegSegmentInfo(1052614, 65497, 2), + ), + 14 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 76), + JpegSegmentAnalyzer.JpegSegmentInfo(96, 65517, 112), + JpegSegmentAnalyzer.JpegSegmentInfo(208, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(3022, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(3091, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(3160, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(3179, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(3210, 65476, 84), + JpegSegmentAnalyzer.JpegSegmentInfo(3294, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(3324, 65476, 55), + JpegSegmentAnalyzer.JpegSegmentInfo(3379, 65498, 216298), + JpegSegmentAnalyzer.JpegSegmentInfo(219677, 65497, 2), + ), + 15 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 36652), + JpegSegmentAnalyzer.JpegSegmentInfo(36672, 65517, 76), + JpegSegmentAnalyzer.JpegSegmentInfo(36748, 65505, 2947), + JpegSegmentAnalyzer.JpegSegmentInfo(39695, 65506, 4096), + JpegSegmentAnalyzer.JpegSegmentInfo(43791, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(43860, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(43929, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(43948, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(43978, 65476, 74), + JpegSegmentAnalyzer.JpegSegmentInfo(44052, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(44080, 65476, 46), + JpegSegmentAnalyzer.JpegSegmentInfo(44126, 65498, 1551863), + JpegSegmentAnalyzer.JpegSegmentInfo(1595989, 65497, 2), + ), + 16 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 19000), + JpegSegmentAnalyzer.JpegSegmentInfo(19002, 65517, 18424), + JpegSegmentAnalyzer.JpegSegmentInfo(37426, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(40588, 65505, 15566), + JpegSegmentAnalyzer.JpegSegmentInfo(56154, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(56170, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(56239, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(56308, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(56327, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(56357, 65476, 74), + JpegSegmentAnalyzer.JpegSegmentInfo(56431, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(56461, 65476, 71), + JpegSegmentAnalyzer.JpegSegmentInfo(56532, 65498, 1160100), + JpegSegmentAnalyzer.JpegSegmentInfo(1216632, 65497, 2), + ), + 17 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 292), + JpegSegmentAnalyzer.JpegSegmentInfo(294, 65505, 2999), + JpegSegmentAnalyzer.JpegSegmentInfo(3293, 65517, 118), + JpegSegmentAnalyzer.JpegSegmentInfo(3411, 65505, 46), + JpegSegmentAnalyzer.JpegSegmentInfo(3457, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(3473, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(3542, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(3611, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(3630, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(3661, 65476, 93), + JpegSegmentAnalyzer.JpegSegmentInfo(3754, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(3783, 65476, 55), + JpegSegmentAnalyzer.JpegSegmentInfo(3838, 65498, 1203907), + JpegSegmentAnalyzer.JpegSegmentInfo(1207745, 65497, 2), + ), + 18 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 15788), + JpegSegmentAnalyzer.JpegSegmentInfo(15790, 65517, 15214), + JpegSegmentAnalyzer.JpegSegmentInfo(31004, 65506, 578), + JpegSegmentAnalyzer.JpegSegmentInfo(31582, 65505, 14448), + JpegSegmentAnalyzer.JpegSegmentInfo(46030, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(46046, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(46115, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(46184, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(46203, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(46233, 65476, 64), + JpegSegmentAnalyzer.JpegSegmentInfo(46297, 65476, 27), + JpegSegmentAnalyzer.JpegSegmentInfo(46324, 65476, 42), + JpegSegmentAnalyzer.JpegSegmentInfo(46366, 65498, 985753), + JpegSegmentAnalyzer.JpegSegmentInfo(1032119, 65497, 2), + ), + 19 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 6030), + JpegSegmentAnalyzer.JpegSegmentInfo(6032, 65517, 7488), + JpegSegmentAnalyzer.JpegSegmentInfo(13520, 65505, 24959), + JpegSegmentAnalyzer.JpegSegmentInfo(38479, 65506, 578), + JpegSegmentAnalyzer.JpegSegmentInfo(39057, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(39073, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(39142, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(39211, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(39230, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(39260, 65476, 75), + JpegSegmentAnalyzer.JpegSegmentInfo(39335, 65476, 27), + JpegSegmentAnalyzer.JpegSegmentInfo(39362, 65476, 49), + JpegSegmentAnalyzer.JpegSegmentInfo(39411, 65498, 1700456), + JpegSegmentAnalyzer.JpegSegmentInfo(1739867, 65497, 2), + ), + 20 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 6996), + JpegSegmentAnalyzer.JpegSegmentInfo(7016, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(7085, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(7154, 65534, 122), + JpegSegmentAnalyzer.JpegSegmentInfo(7276, 65474, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(7295, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(7325, 65476, 22), + JpegSegmentAnalyzer.JpegSegmentInfo(7347, 65498, 5549), + JpegSegmentAnalyzer.JpegSegmentInfo(12896, 65497, 2), + ), + 21 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 20881), + JpegSegmentAnalyzer.JpegSegmentInfo(20883, 65517, 166), + JpegSegmentAnalyzer.JpegSegmentInfo(21049, 65505, 13312), + JpegSegmentAnalyzer.JpegSegmentInfo(34361, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(34495, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(34514, 65476, 420), + JpegSegmentAnalyzer.JpegSegmentInfo(34934, 65498, 6291058), + JpegSegmentAnalyzer.JpegSegmentInfo(6325992, 65497, 2), + ), + 22 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 8379), + JpegSegmentAnalyzer.JpegSegmentInfo(8381, 65505, 8498), + JpegSegmentAnalyzer.JpegSegmentInfo(16879, 65505, 2290), + JpegSegmentAnalyzer.JpegSegmentInfo(19169, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(22331, 65517, 9392), + JpegSegmentAnalyzer.JpegSegmentInfo(31723, 65517, 122), + JpegSegmentAnalyzer.JpegSegmentInfo(31845, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(31861, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(31915, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(31984, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(32053, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(32072, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(32103, 65476, 78), + JpegSegmentAnalyzer.JpegSegmentInfo(32181, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(32209, 65476, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(32263, 65498, 5038645), + JpegSegmentAnalyzer.JpegSegmentInfo(5070908, 65497, 2), + ), + 23 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 535), + JpegSegmentAnalyzer.JpegSegmentInfo(537, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(555, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(624, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(693, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(712, 65476, 33), + JpegSegmentAnalyzer.JpegSegmentInfo(745, 65476, 183), + JpegSegmentAnalyzer.JpegSegmentInfo(928, 65476, 33), + JpegSegmentAnalyzer.JpegSegmentInfo(961, 65476, 183), + JpegSegmentAnalyzer.JpegSegmentInfo(1144, 65498, 7709103), + JpegSegmentAnalyzer.JpegSegmentInfo(7710247, 65497, 2), + ), + 24 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 11596), + JpegSegmentAnalyzer.JpegSegmentInfo(11598, 65517, 10942), + JpegSegmentAnalyzer.JpegSegmentInfo(22540, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(25702, 65505, 13902), + JpegSegmentAnalyzer.JpegSegmentInfo(39604, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(39620, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(39689, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(39758, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(39777, 65476, 32), + JpegSegmentAnalyzer.JpegSegmentInfo(39809, 65476, 102), + JpegSegmentAnalyzer.JpegSegmentInfo(39911, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(39941, 65476, 76), + JpegSegmentAnalyzer.JpegSegmentInfo(40017, 65498, 1286743), + JpegSegmentAnalyzer.JpegSegmentInfo(1326760, 65497, 2), + ), + 25 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 7020), + JpegSegmentAnalyzer.JpegSegmentInfo(7022, 65517, 8736), + JpegSegmentAnalyzer.JpegSegmentInfo(15758, 65505, 18443), + JpegSegmentAnalyzer.JpegSegmentInfo(34201, 65506, 578), + JpegSegmentAnalyzer.JpegSegmentInfo(34779, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(34795, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(34864, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(34933, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(34952, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(34982, 65476, 89), + JpegSegmentAnalyzer.JpegSegmentInfo(35071, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(35101, 65476, 58), + JpegSegmentAnalyzer.JpegSegmentInfo(35159, 65498, 1517109), + JpegSegmentAnalyzer.JpegSegmentInfo(1552268, 65497, 2), + ), + 26 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65517, 212), + JpegSegmentAnalyzer.JpegSegmentInfo(232, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(3394, 65505, 832), + JpegSegmentAnalyzer.JpegSegmentInfo(4226, 65505, 11239), + JpegSegmentAnalyzer.JpegSegmentInfo(15465, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(15534, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(15603, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(15622, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(15653, 65476, 86), + JpegSegmentAnalyzer.JpegSegmentInfo(15739, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(15769, 65476, 67), + JpegSegmentAnalyzer.JpegSegmentInfo(15836, 65498, 810641), + JpegSegmentAnalyzer.JpegSegmentInfo(826477, 65497, 2), + ), + 27 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 10636), + JpegSegmentAnalyzer.JpegSegmentInfo(10638, 65517, 9956), + JpegSegmentAnalyzer.JpegSegmentInfo(20594, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(23756, 65505, 11510), + JpegSegmentAnalyzer.JpegSegmentInfo(35266, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(35282, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(35351, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(35420, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(35439, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(35470, 65476, 88), + JpegSegmentAnalyzer.JpegSegmentInfo(35558, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(35588, 65476, 80), + JpegSegmentAnalyzer.JpegSegmentInfo(35668, 65498, 1255701), + JpegSegmentAnalyzer.JpegSegmentInfo(1291369, 65497, 2), + ), + 28 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 22208), + JpegSegmentAnalyzer.JpegSegmentInfo(22210, 65517, 104), + JpegSegmentAnalyzer.JpegSegmentInfo(22314, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(25128, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(25197, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(25266, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(25285, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(25316, 65476, 75), + JpegSegmentAnalyzer.JpegSegmentInfo(25391, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(25421, 65476, 61), + JpegSegmentAnalyzer.JpegSegmentInfo(25482, 65498, 264305), + JpegSegmentAnalyzer.JpegSegmentInfo(289787, 65497, 2), + ), + 29 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 5628), + JpegSegmentAnalyzer.JpegSegmentInfo(5630, 65517, 7044), + JpegSegmentAnalyzer.JpegSegmentInfo(12674, 65505, 13188), + JpegSegmentAnalyzer.JpegSegmentInfo(25862, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(29024, 65518, 40), + JpegSegmentAnalyzer.JpegSegmentInfo(29064, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(29118, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(29187, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(29256, 65474, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(29275, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(29305, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(29333, 65498, 1589969), + JpegSegmentAnalyzer.JpegSegmentInfo(1619302, 65497, 2), + ), + 30 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 4842), + JpegSegmentAnalyzer.JpegSegmentInfo(4844, 65505, 130), + JpegSegmentAnalyzer.JpegSegmentInfo(4974, 65505, 130), + JpegSegmentAnalyzer.JpegSegmentInfo(5104, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(8266, 65517, 9392), + JpegSegmentAnalyzer.JpegSegmentInfo(17658, 65517, 122), + JpegSegmentAnalyzer.JpegSegmentInfo(17780, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(17796, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(17850, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(17919, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(17988, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(18007, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(18038, 65476, 78), + JpegSegmentAnalyzer.JpegSegmentInfo(18116, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(18144, 65476, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(18198, 65498, 5038645), + JpegSegmentAnalyzer.JpegSegmentInfo(5056843, 65497, 2), + ), + 31 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 18040), + JpegSegmentAnalyzer.JpegSegmentInfo(18042, 65517, 114), + JpegSegmentAnalyzer.JpegSegmentInfo(18156, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(20970, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(21039, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(21108, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(21127, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(21157, 65476, 88), + JpegSegmentAnalyzer.JpegSegmentInfo(21245, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(21273, 65476, 46), + JpegSegmentAnalyzer.JpegSegmentInfo(21319, 65498, 1751816), + JpegSegmentAnalyzer.JpegSegmentInfo(1773135, 65497, 2), + ), + 32 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 9798), + JpegSegmentAnalyzer.JpegSegmentInfo(9800, 65517, 9720), + JpegSegmentAnalyzer.JpegSegmentInfo(19520, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(22682, 65505, 3447), + JpegSegmentAnalyzer.JpegSegmentInfo(26129, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(26145, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(26199, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(26268, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(26337, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(26356, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(26386, 65476, 81), + JpegSegmentAnalyzer.JpegSegmentInfo(26467, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(26496, 65476, 59), + JpegSegmentAnalyzer.JpegSegmentInfo(26555, 65498, 933304), + JpegSegmentAnalyzer.JpegSegmentInfo(959859, 65497, 2), + ), + 33 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 13748), + JpegSegmentAnalyzer.JpegSegmentInfo(13750, 65517, 13028), + JpegSegmentAnalyzer.JpegSegmentInfo(26778, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(29940, 65505, 11427), + JpegSegmentAnalyzer.JpegSegmentInfo(41367, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(41501, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(41507, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(41523, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(41542, 65476, 195), + JpegSegmentAnalyzer.JpegSegmentInfo(41737, 65498, 1498590), + JpegSegmentAnalyzer.JpegSegmentInfo(1540327, 65497, 2), + ), + 34 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 12892), + JpegSegmentAnalyzer.JpegSegmentInfo(12912, 65517, 102), + JpegSegmentAnalyzer.JpegSegmentInfo(13014, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(15828, 65506, 8702), + JpegSegmentAnalyzer.JpegSegmentInfo(24530, 65514, 3670), + JpegSegmentAnalyzer.JpegSegmentInfo(28200, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(28269, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(28338, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(28357, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(28387, 65476, 76), + JpegSegmentAnalyzer.JpegSegmentInfo(28463, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(28492, 65476, 46), + JpegSegmentAnalyzer.JpegSegmentInfo(28538, 65498, 1756223), + JpegSegmentAnalyzer.JpegSegmentInfo(1784761, 65497, 2), + ), + 35 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 12526), + JpegSegmentAnalyzer.JpegSegmentInfo(12528, 65517, 11826), + JpegSegmentAnalyzer.JpegSegmentInfo(24354, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(27516, 65505, 14486), + JpegSegmentAnalyzer.JpegSegmentInfo(42002, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(42018, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(42072, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(42141, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(42210, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(42229, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(42259, 65476, 77), + JpegSegmentAnalyzer.JpegSegmentInfo(42336, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(42365, 65476, 57), + JpegSegmentAnalyzer.JpegSegmentInfo(42422, 65498, 1215580), + JpegSegmentAnalyzer.JpegSegmentInfo(1258002, 65497, 2), + ), + 36 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 18), + JpegSegmentAnalyzer.JpegSegmentInfo(20, 65505, 1350), + JpegSegmentAnalyzer.JpegSegmentInfo(1370, 65505, 4162), + JpegSegmentAnalyzer.JpegSegmentInfo(5532, 65517, 626), + JpegSegmentAnalyzer.JpegSegmentInfo(6158, 65506, 614), + JpegSegmentAnalyzer.JpegSegmentInfo(6772, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(6841, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(6910, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(6929, 65476, 32), + JpegSegmentAnalyzer.JpegSegmentInfo(6961, 65476, 91), + JpegSegmentAnalyzer.JpegSegmentInfo(7052, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(7083, 65476, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(7152, 65498, 1628511), + JpegSegmentAnalyzer.JpegSegmentInfo(1635663, 65497, 2), + ), + 37 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 2598), + JpegSegmentAnalyzer.JpegSegmentInfo(2600, 65517, 43100), + JpegSegmentAnalyzer.JpegSegmentInfo(45700, 65505, 38195), + JpegSegmentAnalyzer.JpegSegmentInfo(83895, 65506, 578), + JpegSegmentAnalyzer.JpegSegmentInfo(84473, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(84489, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(84558, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(84627, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(84646, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(84677, 65476, 82), + JpegSegmentAnalyzer.JpegSegmentInfo(84759, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(84788, 65476, 61), + JpegSegmentAnalyzer.JpegSegmentInfo(84849, 65498, 362619), + JpegSegmentAnalyzer.JpegSegmentInfo(447468, 65497, 2), + ), + 38 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 11990), + JpegSegmentAnalyzer.JpegSegmentInfo(11992, 65517, 13484), + JpegSegmentAnalyzer.JpegSegmentInfo(25476, 65505, 13073), + JpegSegmentAnalyzer.JpegSegmentInfo(38549, 65506, 578), + JpegSegmentAnalyzer.JpegSegmentInfo(39127, 65518, 35), + JpegSegmentAnalyzer.JpegSegmentInfo(39162, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(39231, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(39300, 65474, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(39319, 65476, 32), + JpegSegmentAnalyzer.JpegSegmentInfo(39351, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(39380, 65498, 1317385), + JpegSegmentAnalyzer.JpegSegmentInfo(1356765, 65497, 2), + ), + 39 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 22782), + JpegSegmentAnalyzer.JpegSegmentInfo(22784, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(25598, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(25652, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(25721, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(25790, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(25809, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(25840, 65476, 79), + JpegSegmentAnalyzer.JpegSegmentInfo(25919, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(25947, 65476, 44), + JpegSegmentAnalyzer.JpegSegmentInfo(25991, 65498, 1191901), + JpegSegmentAnalyzer.JpegSegmentInfo(1217892, 65497, 2), + ), + 40 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 4388), + JpegSegmentAnalyzer.JpegSegmentInfo(4390, 65517, 5864), + JpegSegmentAnalyzer.JpegSegmentInfo(10254, 65505, 15566), + JpegSegmentAnalyzer.JpegSegmentInfo(25820, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(28982, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(28998, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(29067, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(29136, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(29155, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(29185, 65476, 74), + JpegSegmentAnalyzer.JpegSegmentInfo(29259, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(29289, 65476, 59), + JpegSegmentAnalyzer.JpegSegmentInfo(29348, 65498, 1651935), + JpegSegmentAnalyzer.JpegSegmentInfo(1681283, 65497, 2), + ), + 41 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 45619), + JpegSegmentAnalyzer.JpegSegmentInfo(45621, 65517, 78), + JpegSegmentAnalyzer.JpegSegmentInfo(45699, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(48513, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(48582, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(48651, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(48670, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(48700, 65476, 66), + JpegSegmentAnalyzer.JpegSegmentInfo(48766, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(48794, 65476, 40), + JpegSegmentAnalyzer.JpegSegmentInfo(48834, 65498, 911992), + JpegSegmentAnalyzer.JpegSegmentInfo(960826, 65497, 2), + ), + 42 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 21950), + JpegSegmentAnalyzer.JpegSegmentInfo(21952, 65517, 21320), + JpegSegmentAnalyzer.JpegSegmentInfo(43272, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(46434, 65505, 15499), + JpegSegmentAnalyzer.JpegSegmentInfo(61933, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(61949, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(62018, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(62087, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(62106, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(62136, 65476, 76), + JpegSegmentAnalyzer.JpegSegmentInfo(62212, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(62240, 65476, 45), + JpegSegmentAnalyzer.JpegSegmentInfo(62285, 65498, 1485660), + JpegSegmentAnalyzer.JpegSegmentInfo(1547945, 65497, 2), + ), + 43 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65504, 22), + JpegSegmentAnalyzer.JpegSegmentInfo(24, 65505, 2116), + JpegSegmentAnalyzer.JpegSegmentInfo(2140, 65506, 90), + JpegSegmentAnalyzer.JpegSegmentInfo(2230, 65506, 566), + JpegSegmentAnalyzer.JpegSegmentInfo(2796, 65517, 114), + JpegSegmentAnalyzer.JpegSegmentInfo(2910, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(5724, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(5793, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(5862, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(5881, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(5911, 65476, 77), + JpegSegmentAnalyzer.JpegSegmentInfo(5988, 65476, 26), + JpegSegmentAnalyzer.JpegSegmentInfo(6014, 65476, 40), + JpegSegmentAnalyzer.JpegSegmentInfo(6054, 65498, 1216476), + JpegSegmentAnalyzer.JpegSegmentInfo(1222530, 65497, 2), + ), + 44 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 18248), + JpegSegmentAnalyzer.JpegSegmentInfo(18250, 65517, 116), + JpegSegmentAnalyzer.JpegSegmentInfo(18366, 65505, 2814), + JpegSegmentAnalyzer.JpegSegmentInfo(21180, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(21249, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(21318, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(21337, 65476, 31), + JpegSegmentAnalyzer.JpegSegmentInfo(21368, 65476, 85), + JpegSegmentAnalyzer.JpegSegmentInfo(21453, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(21481, 65476, 43), + JpegSegmentAnalyzer.JpegSegmentInfo(21524, 65498, 1607749), + JpegSegmentAnalyzer.JpegSegmentInfo(1629273, 65497, 2), + ), + 45 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 13662), + JpegSegmentAnalyzer.JpegSegmentInfo(13664, 65505, 30970), + JpegSegmentAnalyzer.JpegSegmentInfo(44634, 65517, 12922), + JpegSegmentAnalyzer.JpegSegmentInfo(57556, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(60718, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(60734, 65534, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(60788, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(60857, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(60926, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(60945, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(60974, 65476, 78), + JpegSegmentAnalyzer.JpegSegmentInfo(61052, 65476, 28), + JpegSegmentAnalyzer.JpegSegmentInfo(61080, 65476, 50), + JpegSegmentAnalyzer.JpegSegmentInfo(61130, 65498, 1245290), + JpegSegmentAnalyzer.JpegSegmentInfo(1306420, 65497, 2), + ), + 46 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 11356), + JpegSegmentAnalyzer.JpegSegmentInfo(11358, 65517, 10788), + JpegSegmentAnalyzer.JpegSegmentInfo(22146, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(25308, 65505, 12810), + JpegSegmentAnalyzer.JpegSegmentInfo(38118, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(38252, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(38258, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(38274, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(38293, 65476, 162), + JpegSegmentAnalyzer.JpegSegmentInfo(38455, 65498, 753335), + JpegSegmentAnalyzer.JpegSegmentInfo(791790, 65497, 2), + ), + 47 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 12452), + JpegSegmentAnalyzer.JpegSegmentInfo(12454, 65517, 11752), + JpegSegmentAnalyzer.JpegSegmentInfo(24206, 65506, 3162), + JpegSegmentAnalyzer.JpegSegmentInfo(27368, 65505, 27253), + JpegSegmentAnalyzer.JpegSegmentInfo(54621, 65518, 16), + JpegSegmentAnalyzer.JpegSegmentInfo(54637, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(54706, 65499, 69), + JpegSegmentAnalyzer.JpegSegmentInfo(54775, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(54794, 65476, 30), + JpegSegmentAnalyzer.JpegSegmentInfo(54824, 65476, 79), + JpegSegmentAnalyzer.JpegSegmentInfo(54903, 65476, 29), + JpegSegmentAnalyzer.JpegSegmentInfo(54932, 65476, 50), + JpegSegmentAnalyzer.JpegSegmentInfo(54982, 65498, 1126226), + JpegSegmentAnalyzer.JpegSegmentInfo(1181208, 65497, 2), + ), + 48 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 13524), + JpegSegmentAnalyzer.JpegSegmentInfo(13526, 65506, 554), + JpegSegmentAnalyzer.JpegSegmentInfo(14080, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(14214, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(14220, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(14239, 65476, 420), + JpegSegmentAnalyzer.JpegSegmentInfo(14659, 65498, 6790271), + JpegSegmentAnalyzer.JpegSegmentInfo(6804930, 65497, 2), + ), + 49 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 20366), + JpegSegmentAnalyzer.JpegSegmentInfo(20368, 65505, 2562), + JpegSegmentAnalyzer.JpegSegmentInfo(22930, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(23064, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(23083, 65476, 420), + JpegSegmentAnalyzer.JpegSegmentInfo(23503, 65498, 9266056), + JpegSegmentAnalyzer.JpegSegmentInfo(9289559, 65497, 2), + ), + 50 to listOf( + JpegSegmentAnalyzer.JpegSegmentInfo(0, 65496, 2), + JpegSegmentAnalyzer.JpegSegmentInfo(2, 65505, 65470), + JpegSegmentAnalyzer.JpegSegmentInfo(65472, 65505, 12288), + JpegSegmentAnalyzer.JpegSegmentInfo(77760, 65506, 138), + JpegSegmentAnalyzer.JpegSegmentInfo(77898, 65506, 54), + JpegSegmentAnalyzer.JpegSegmentInfo(77952, 65506, 44098), + JpegSegmentAnalyzer.JpegSegmentInfo(122050, 65476, 420), + JpegSegmentAnalyzer.JpegSegmentInfo(122470, 65499, 134), + JpegSegmentAnalyzer.JpegSegmentInfo(122604, 65501, 6), + JpegSegmentAnalyzer.JpegSegmentInfo(122610, 65472, 19), + JpegSegmentAnalyzer.JpegSegmentInfo(122629, 65498, 14607244), + JpegSegmentAnalyzer.JpegSegmentInfo(14729873, 65497, 2), + ), + ) + + /** + * Regression test based on a fixed small set of test files. + */ + @OptIn(ExperimentalStdlibApi::class) + @Test + fun testFindSegmentInfos() { + + for (index in 1..KimTestData.HIGHEST_JPEG_INDEX) { + + val bytes = KimTestData.getBytesOf(index) + + val byteReader = ByteArrayByteReader(bytes) + + val segmentInfos = JpegSegmentAnalyzer.findSegmentInfos(byteReader) + + /* Integrity check to prevent persistance of wrong results. */ + assertEquals( + expected = bytes.size, + actual = segmentInfos.sumOf { it.length }, + message = "Sum of lengths should match bytes size." + ) + + /* Check that markers are correct. */ + for (segmentInfo in segmentInfos) { + + val offset = segmentInfo.offset.toInt() + + val markerAtOffset = byteArrayOf( + bytes[offset], + bytes[offset + 1] + ).toUInt16(JPEG_BYTE_ORDER) + + assertEquals( + expected = segmentInfo.marker, + actual = markerAtOffset, + message = "Unexpected marker." + ) + } + + /* Compare previously saved results. */ + assertEquals( + expected = expectedMap.get(index), + actual = segmentInfos + ) + } + } +} diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_15_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_15_modified.txt index aa268fae..a13f1cf4 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_15_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_15_modified.txt @@ -16,7 +16,7 @@ Big-endian (Motorola, MM) 0x0213 YCbCrPositioning = 2 0x8769 ExifOffset = 2372 0x8825 GPSInfo = 22226 -0xea1c Unknown = [2060 bytes] +0xea1c Padding = [2060 bytes] ---- Directory ExifIFD ---- 0x829a ExposureTime = 10/1250 (0.008) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_19_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_19_modified.txt index 817dbfb8..5e99cc87 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_19_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_19_modified.txt @@ -25,7 +25,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = -07:00 +0x9010 OffsetTime = -07:00 0x9011 OffsetTimeOriginal = -08:00 0x9012 Unknown = -08:00 0x9201 ShutterSpeedValue = 9643856/1000000 (9.643856) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_1_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_1_modified.txt index dc8180f6..a5e90c72 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_1_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_1_modified.txt @@ -13,12 +13,12 @@ Little-endian (Intel, II) 0x0131 Software = darktable 2.6.2 0x0132 ModifyDate = 2023:05:10 13:37:42 0x013b Artist = dxfoto.ru -0x00-1 Unknown = 0 -0x00-1 Unknown = 0 +0x4746 Unknown = 0 +0x4749 Unknown = 0 0x8298 Copyright = CC-BY 3.0 0x8769 ExifOffset = 306 0x8825 GPSInfo = 6526 -0x00-1 Unknown = 2019:07:14 09:21:11 +0x9003 Unknown = 2019:07:14 09:21:11 ---- Directory ExifIFD ---- 0x829a ExposureTime = 1/400 (0.0025) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_22_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_22_modified.txt index d482a093..c4204189 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_22_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_22_modified.txt @@ -24,7 +24,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = +00:00 +0x9010 OffsetTime = +00:00 0x9101 ComponentsConfiguration = [0x01, 0x02, 0x03, 0x00] 0x9201 ShutterSpeedValue = 133006/19257 (6.906891) 0x9202 ApertureValue = 2/1 (2.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_23_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_23_modified.txt index df990dd2..d61f0abe 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_23_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_23_modified.txt @@ -17,7 +17,7 @@ Big-endian (Motorola, MM) 0x8827 PhotographicSensitivity = 1939 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = +01:00 +0x9010 OffsetTime = +01:00 0x9011 OffsetTimeOriginal = +01:00 0x9012 Unknown = +01:00 0x9202 ApertureValue = 188/100 (1.88) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_28_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_28_modified.txt index 5201235f..e5b581bc 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_28_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_28_modified.txt @@ -62,8 +62,8 @@ Little-endian (Intel, II) ---- Directory InteropIFD ---- 0x0001 InteroperabilityIndex = R98 0x0002 InteroperabilityVersion = [0x30, 0x31, 0x30, 0x30] -0x1001 Unknown = 2304 -0x1002 Unknown = 1536 +0x1001 RelatedImageWidth = 2304 +0x1002 RelatedImageHeight = 1536 ---- Directory GPS ---- 0x0000 GPSVersionID = [0x02, 0x03, 0x00, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_42_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_42_modified.txt index b9df6fee..7fa1423a 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_42_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_42_modified.txt @@ -27,7 +27,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 9643856/1000000 (9.643856) 0x9202 ApertureValue = 4970854/1000000 (4.970854) 0x9204 ExposureCompensation = -2/3 (-0.666667) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_48_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_48_modified.txt index e4e6fa70..5131dd15 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_48_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_48_modified.txt @@ -25,7 +25,7 @@ Big-endian (Motorola, MM) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x32] 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = +01:00 +0x9010 OffsetTime = +01:00 0x9011 OffsetTimeOriginal = +01:00 0x9012 Unknown = +01:00 0x9101 ComponentsConfiguration = [0x01, 0x02, 0x03, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_4_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_4_modified.txt index f93b429b..a8ac1f08 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_4_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_4_modified.txt @@ -25,7 +25,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = -05:00 +0x9010 OffsetTime = -05:00 0x9201 ShutterSpeedValue = 9321928/1000000 (9.321928) 0x9202 ApertureValue = 4970854/1000000 (4.970854) 0x9204 ExposureCompensation = 0/1 (0.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_6_modified.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_6_modified.txt index 764102f0..220c6f43 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_6_modified.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/modified/photo_6_modified.txt @@ -25,7 +25,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2023:05:10 13:37:42 0x9004 DateTimeDigitized = 2023:05:10 13:37:42 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 7965784/1000000 (7.965784) 0x9202 ApertureValue = 6/1 (6.0) 0x9203 BrightnessValue = 17574/2560 (6.864844) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_1.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_1.txt index f0849d65..abecdda5 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_1.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_1.txt @@ -13,12 +13,12 @@ Little-endian (Intel, II) 0x0131 Software = darktable 2.6.2 0x0132 ModifyDate = 2019:07:15 20:09:19 0x013b Artist = dxfoto.ru -0x00-1 Unknown = 0 -0x00-1 Unknown = 0 +0x4746 Unknown = 0 +0x4749 Unknown = 0 0x8298 Copyright = CC-BY 3.0 0x8769 ExifOffset = 306 0x8825 GPSInfo = 6526 -0x00-1 Unknown = 2019:07:14 09:21:11 +0x9003 Unknown = 2019:07:14 09:21:11 ---- Directory ExifIFD ---- 0x829a ExposureTime = 1/400 (0.0025) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_15.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_15.txt index 98822d38..08249b02 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_15.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_15.txt @@ -18,7 +18,7 @@ Big-endian (Motorola, MM) 0x8298 Copyright = 0x8769 ExifOffset = 2490 0x8825 GPSInfo = 22304 -0xea1c Unknown = [2060 bytes] +0xea1c Padding = [2060 bytes] ---- Directory ExifIFD ---- 0x829a ExposureTime = 10/1250 (0.008) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_19.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_19.txt index 8ec97d3c..30285d3a 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_19.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_19.txt @@ -24,7 +24,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2020:01:18 17:28:22 0x9004 DateTimeDigitized = 2020:01:18 17:28:22 -0x9010 Unknown = -07:00 +0x9010 OffsetTime = -07:00 0x9011 OffsetTimeOriginal = -08:00 0x9012 Unknown = -08:00 0x9201 ShutterSpeedValue = 9643856/1000000 (9.643856) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_22.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_22.txt index e495da94..250a7f88 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_22.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_22.txt @@ -22,7 +22,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2020:02:17 14:47:46 0x9004 DateTimeDigitized = 2020:02:17 14:47:46 -0x9010 Unknown = +00:00 +0x9010 OffsetTime = +00:00 0x9101 ComponentsConfiguration = [0x01, 0x02, 0x03, 0x00] 0x9201 ShutterSpeedValue = 133006/19257 (6.906891) 0x9202 ApertureValue = 2/1 (2.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_23.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_23.txt index 463031bd..6d567bdd 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_23.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_23.txt @@ -17,7 +17,7 @@ Big-endian (Motorola, MM) 0x829a ExposureTime = 40/1000 (0.04) 0x9012 Unknown = +01:00 0x9011 OffsetTimeOriginal = +01:00 -0x9010 Unknown = +01:00 +0x9010 OffsetTime = +01:00 0x920a FocalLength = 559/100 (5.59) 0x9209 Flash = 0 0x8827 PhotographicSensitivity = 1939 diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_28.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_28.txt index d36ee894..c1267a1c 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_28.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_28.txt @@ -65,8 +65,8 @@ Little-endian (Intel, II) ---- Directory InteropIFD ---- 0x0001 InteroperabilityIndex = R98 0x0002 InteroperabilityVersion = [0x30, 0x31, 0x30, 0x30] -0x1001 Unknown = 2304 -0x1002 Unknown = 1536 +0x1001 RelatedImageWidth = 2304 +0x1002 RelatedImageHeight = 1536 ---- Directory GPS ---- 0x0000 GPSVersionID = [0x02, 0x03, 0x00, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_4.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_4.txt index 23faa1dc..69e3311e 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_4.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_4.txt @@ -23,7 +23,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2019:12:23 01:28:28 0x9004 DateTimeDigitized = 2019:12:23 01:28:28 -0x9010 Unknown = -05:00 +0x9010 OffsetTime = -05:00 0x9201 ShutterSpeedValue = 9321928/1000000 (9.321928) 0x9202 ApertureValue = 4970854/1000000 (4.970854) 0x9204 ExposureCompensation = 0/1 (0.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_42.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_42.txt index f7ba4dba..82ca0ef8 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_42.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_42.txt @@ -25,7 +25,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2019:10:03 13:44:17 0x9004 DateTimeDigitized = 2019:10:03 13:44:17 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 9643856/1000000 (9.643856) 0x9202 ApertureValue = 4970854/1000000 (4.970854) 0x9204 ExposureCompensation = -2/3 (-0.666667) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_48.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_48.txt index d06a5244..b24fa3b5 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_48.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_48.txt @@ -24,7 +24,7 @@ Big-endian (Motorola, MM) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x32] 0x9003 DateTimeOriginal = 2022:11:30 14:57:00 0x9004 DateTimeDigitized = 2022:11:30 14:57:00 -0x9010 Unknown = +01:00 +0x9010 OffsetTime = +01:00 0x9011 OffsetTimeOriginal = +01:00 0x9012 Unknown = +01:00 0x9101 ComponentsConfiguration = [0x01, 0x02, 0x03, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_51.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_51.txt index b517f186..fd47519f 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_51.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_51.txt @@ -30,7 +30,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2020:03:11 17:37:33 0x9004 DateTimeDigitized = 2020:03:11 17:37:33 -0x9010 Unknown = +07:00 +0x9010 OffsetTime = +07:00 0x9011 OffsetTimeOriginal = +08:00 0x9012 Unknown = +08:00 0x9201 ShutterSpeedValue = 6965784/1000000 (6.965784) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_53.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_53.txt index 5b36f3dc..2d2b61a2 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_53.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_53.txt @@ -16,12 +16,12 @@ Little-endian (Intel, II) 0x0131 Software = GIMP 2.10.30 0x0132 ModifyDate = 2023:05:08 16:42:23 0x013b Artist = dxfoto.ru -0x00-1 Unknown = 0 -0x00-1 Unknown = 0 +0x4746 Unknown = 0 +0x4749 Unknown = 0 0x8298 Copyright = CC-BY 3.0 0x8769 ExifOffset = 346 0x8825 GPSInfo = 9672 -0x00-1 Unknown = 2019:07:14 09:21:11 +0x9003 Unknown = 2019:07:14 09:21:11 ---- Directory ExifIFD ---- 0x829a ExposureTime = 1/400 (0.0025) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_54.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_54.txt index 81cd387e..505c7765 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_54.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_54.txt @@ -27,8 +27,8 @@ Little-endian (Intel, II) 0x83bb IPTC-NAA = [53 bytes] 0x8649 PhotoshopSettings = [28 bytes] 0x8769 ExifOffset = 2887292 -0x8773 Unknown = [596 bytes] -0xc7e0 Unknown = [110 bytes] +0x8773 ICC_Profile = [596 bytes] +0xc7e0 AffinityPhoto = [110 bytes] ---- Directory ExifIFD ---- 0x829a ExposureTime = 1/30 (0.033333) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_55.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_55.txt index a13c2d77..e8cd21c0 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_55.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_55.txt @@ -28,8 +28,8 @@ Little-endian (Intel, II) 0x83bb IPTC-NAA = [53 bytes] 0x8649 PhotoshopSettings = [28 bytes] 0x8769 ExifOffset = 2027096 -0x8773 Unknown = [596 bytes] -0xc7e0 Unknown = [110 bytes] +0x8773 ICC_Profile = [596 bytes] +0xc7e0 AffinityPhoto = [110 bytes] ---- Directory ExifIFD ---- 0x829a ExposureTime = 1/30 (0.033333) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_56.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_56.txt index d7d5f684..ae526cad 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_56.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_56.txt @@ -28,8 +28,8 @@ Little-endian (Intel, II) 0x83bb IPTC-NAA = [53 bytes] 0x8649 PhotoshopSettings = [28 bytes] 0x8769 ExifOffset = 2269666 -0x8773 Unknown = [596 bytes] -0xc7e0 Unknown = [110 bytes] +0x8773 ICC_Profile = [596 bytes] +0xc7e0 AffinityPhoto = [110 bytes] ---- Directory ExifIFD ---- 0x829a ExposureTime = 1/30 (0.033333) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_6.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_6.txt index f645ec3e..dcbe81e1 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_6.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_6.txt @@ -23,7 +23,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2019:02:25 06:14:16 0x9004 DateTimeDigitized = 2019:02:25 06:14:16 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 7965784/1000000 (7.965784) 0x9202 ApertureValue = 6/1 (6.0) 0x9203 BrightnessValue = 17574/2560 (6.864844) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_62.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_62.txt index 3005d5a2..de00107f 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_62.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_62.txt @@ -27,7 +27,7 @@ Big-endian (Motorola, MM) 0x0214 ReferenceBlackWhite = [0/1 (0.0), 255/1 (255.0), 0/1 (0.0), 255/1 (255.0), 0/1 (0.0), 255/1 (255.0)] 0x8769 ExifOffset = 480 0x8825 GPSInfo = 124124 -0x00-1 Unknown = 2014:08:12 09:30:58 +0x9003 Unknown = 2014:08:12 09:30:58 0x9216 Unknown = [0x01, 0x00, 0x00, 0x00] ---- Directory ExifIFD ---- diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_64.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_64.txt index 7bb9277f..85ff1f26 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_64.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_64.txt @@ -4,29 +4,29 @@ Resolution : null Version 85 Little-endian (Intel, II) ---- Directory IFD0 ---- -0x00-1 Unknown = [0x30, 0x33, 0x31, 0x30] -0x00-1 Unknown = 3696 -0x00-1 Unknown = 2752 -0x00-1 Unknown = 8 -0x00-1 Unknown = 8 -0x00-1 Unknown = 2744 -0x00-1 Unknown = 3656 -0x00-1 Unknown = 1 -0x00-1 Unknown = 2 -0x00-1 Unknown = 12 +0x0001 Unknown = [0x30, 0x33, 0x31, 0x30] +0x0002 Unknown = 3696 +0x0003 Unknown = 2752 +0x0004 Unknown = 8 +0x0005 Unknown = 8 +0x0006 Unknown = 2744 +0x0007 Unknown = 3656 +0x0008 Unknown = 1 +0x0009 Unknown = 2 +0x000a Unknown = 12 0x000b ProcessingSoftware = -31220 -0x00-1 Unknown = 1 -0x00-1 Unknown = 4095 -0x00-1 Unknown = 4095 -0x00-1 Unknown = 4095 -0x00-1 Unknown = 160 -0x00-1 Unknown = 0 +0x000d Unknown = 1 +0x000e Unknown = 4095 +0x000f Unknown = 4095 +0x0010 Unknown = 4095 +0x0017 Unknown = 160 +0x0018 Unknown = 0 0x0019 Unknown = 0 -0x00-1 Unknown = 0 -0x00-1 Unknown = [26 bytes] -0x00-1 Unknown = 128 -0x00-1 Unknown = 128 -0x00-1 Unknown = 128 +0x001a Unknown = 0 +0x001b Unknown = [26 bytes] +0x001c Unknown = 128 +0x001d Unknown = 128 +0x001e Unknown = 128 0x0024 Unknown = 461 0x0025 Unknown = 265 0x0026 Unknown = 482 diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_66.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_66.txt index a00889e2..1428dbdb 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_66.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_66.txt @@ -74,7 +74,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2021:12:06 05:27:33 0x9004 DateTimeDigitized = 2021:12:06 05:27:33 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 5906891/1000000 (5.906891) 0x9202 ApertureValue = 4643856/1000000 (4.643856) 0x9204 ExposureCompensation = 0/1 (0.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_67.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_67.txt index 68bf9532..7dbdb4b0 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_67.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_67.txt @@ -75,7 +75,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2023:05:19 18:41:50 0x9004 DateTimeDigitized = 2023:05:19 18:41:50 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 5321928/1000000 (5.321928) 0x9202 ApertureValue = 4/1 (4.0) 0x9203 BrightnessValue = 315/100 (3.15) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_68.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_68.txt index d53bab57..f935ab2f 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_68.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_68.txt @@ -72,7 +72,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2014:08:12 09:30:58 0x9004 DateTimeDigitized = 2014:08:12 09:30:58 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 7321928/1000000 (7.321928) 0x9202 ApertureValue = 5310704/1000000 (5.310704) 0x9204 ExposureCompensation = 0/6 (0.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_69.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_69.txt index df7b9393..ab0442da 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_69.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_69.txt @@ -69,7 +69,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2010:02:01 16:03:48 0x9004 DateTimeDigitized = 2010:02:01 16:03:48 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 5906891/1000000 (5.906891) 0x9202 ApertureValue = 6/1 (6.0) 0x9203 BrightnessValue = 587/100 (5.87) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_70.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_70.txt index 7f7589fc..5ff2bd39 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_70.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_70.txt @@ -68,7 +68,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2014:11:19 23:07:44 0x9004 DateTimeDigitized = 2014:11:19 23:07:44 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 5906891/1000000 (5.906891) 0x9202 ApertureValue = 970854/1000000 (0.970854) 0x9204 ExposureCompensation = 0/100 (0.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_71.txt b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_71.txt index a386868c..8019d4cb 100644 --- a/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_71.txt +++ b/src/commonTest/resources/com/ashampoo/kim/testdata/txt/photo_71.txt @@ -69,7 +69,7 @@ Little-endian (Intel, II) 0x9000 ExifVersion = [0x30, 0x32, 0x33, 0x31] 0x9003 DateTimeOriginal = 2014:12:28 15:50:57 0x9004 DateTimeDigitized = 2014:12:28 15:50:57 -0x9010 Unknown = +02:00 +0x9010 OffsetTime = +02:00 0x9201 ShutterSpeedValue = 9321928/1000000 (9.321928) 0x9202 ApertureValue = 4/1 (4.0) 0x9204 ExposureCompensation = 0/10 (0.0) diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.jpg.txt index 6cba7046..567a7509 100644 --- a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.jpg.txt +++ b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.jpg.txt @@ -62,8 +62,8 @@ Little-endian (Intel, II) ---- Directory InteropIFD ---- 0x0001 InteroperabilityIndex = R98 0x0002 InteroperabilityVersion = [0x30, 0x31, 0x30, 0x30] -0x1001 Unknown = 2304 -0x1002 Unknown = 1536 +0x1001 RelatedImageWidth = 2304 +0x1002 RelatedImageHeight = 1536 ---- Directory GPS ---- 0x0000 GPSVersionID = [0x02, 0x03, 0x00, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.no_metadata.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.no_metadata.jpg.txt index f06a0a3d..eee6ddef 100644 --- a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.no_metadata.jpg.txt +++ b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_gps_coordinates.no_metadata.jpg.txt @@ -10,6 +10,7 @@ Big-endian (Motorola, MM) ---- Directory ExifIFD ---- ---- Directory GPS ---- +0x0000 GPSVersionID = [0x02, 0x03, 0x00, 0x00] 0x0001 GPSLatitudeRef = N 0x0002 GPSLatitude = [53/1 (53.0), 13/1 (13.0), 24519/2500 (9.8076)] 0x0003 GPSLongitudeRef = E diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_keywords.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_keywords.jpg.txt index 02c3a2db..30216eee 100644 Binary files a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_keywords.jpg.txt and b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_keywords.jpg.txt differ diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_persons.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_persons.jpg.txt index bb40b393..4f740ca8 100644 Binary files a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_persons.jpg.txt and b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_persons.jpg.txt differ diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_rating.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_rating.jpg.txt index fe0b27f3..4b1a9d73 100644 Binary files a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_rating.jpg.txt and b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_rating.jpg.txt differ diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_taken_date.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_taken_date.jpg.txt index 6ea1962f..9e48dccb 100644 --- a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_taken_date.jpg.txt +++ b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_taken_date.jpg.txt @@ -62,8 +62,8 @@ Little-endian (Intel, II) ---- Directory InteropIFD ---- 0x0001 InteroperabilityIndex = R98 0x0002 InteroperabilityVersion = [0x30, 0x31, 0x30, 0x30] -0x1001 Unknown = 2304 -0x1002 Unknown = 1536 +0x1001 RelatedImageWidth = 2304 +0x1002 RelatedImageHeight = 1536 ---- Directory GPS ---- 0x0000 GPSVersionID = [0x02, 0x03, 0x00, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_thumbnail.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_thumbnail.jpg.txt index 19313127..81270bf3 100644 --- a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_thumbnail.jpg.txt +++ b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/new_thumbnail.jpg.txt @@ -62,8 +62,8 @@ Little-endian (Intel, II) ---- Directory InteropIFD ---- 0x0001 InteroperabilityIndex = R98 0x0002 InteroperabilityVersion = [0x30, 0x31, 0x30, 0x30] -0x1001 Unknown = 2304 -0x1002 Unknown = 1536 +0x1001 RelatedImageWidth = 2304 +0x1002 RelatedImageHeight = 1536 ---- Directory GPS ---- 0x0000 GPSVersionID = [0x02, 0x03, 0x00, 0x00] diff --git a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/rotated_right.jpg.txt b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/rotated_right.jpg.txt index c584c9ce..a237305e 100644 Binary files a/src/commonTest/resources/com/ashampoo/kim/updates_jpg/rotated_right.jpg.txt and b/src/commonTest/resources/com/ashampoo/kim/updates_jpg/rotated_right.jpg.txt differ