Exchangeable image file format (Exif): Go parsing library

This page hosts a formal specification of Exchangeable image file format (Exif) using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Go source code to parse Exchangeable image file format (Exif)

exif.go

// Code generated by kaitai-struct-compiler from a .ksy source file. DO NOT EDIT.

import (
	"github.com/kaitai-io/kaitai_struct_go_runtime/kaitai"
	"io"
	"bytes"
)


/**
 * Sample files (numbers in parentheses show how many files per extension contain
 * Exif metadata out of the total):
 * 
 * * <https://github.com/ianare/exif-py/tree/a69bf74770caf6b333221658f5092ed69f99faac/tests/resources/jpg> (84/93 .jpg, 1/1 .jpeg)
 * * <https://github.com/exiftool/exiftool/tree/2200871d9cef988051d2a99d67df3bda6cbb30a8/t/images> (34/41 .jpg, 0/1 .png)
 * * <https://github.com/Exiv2/exiv2/tree/648ada43dcb35ce6077f38183ace52d5e2071f64/test/data> (85/155 .jpg, 5/23 .png)
 * * <https://github.com/python-pillow/Pillow/tree/807d689a83738027b6f6e0f219a6a6dd30e01c08/Tests/images> (36/55 .jpg, 3/420 .png)
 * * <https://github.com/drewnoakes/metadata-extractor-images/tree/651ad0e67aa8d43d358ad05f9bc07b52d8b9ac6e/jpg> (335/430 .jpg)
 * * <https://github.com/libexif/libexif-testsuite/tree/8c1f5bbc18d2cbc80b01b3f9b3eb29546310acf2> (15/18 .jpg)
 * @see <a href="https://www.cipa.jp/std/documents/download_e.html?CIPA_DC-008-2026-E">Exif Version 3.1</a>
 * @see <a href="https://www.cipa.jp/std/documents/download_e.html?CIPA_DC-008-2024-E">Exif Version 3.0</a>
 * @see <a href="https://web.archive.org/web/20190624045241id_/https://www.cipa.jp/std/documents/e/DC-008-Translation-2019-E.pdf">Exif Version 2.32</a>
 * @see <a href="https://web.archive.org/web/20190712232333id_/https://www.cipa.jp/std/documents/e/DC-008-Translation-2016-E.pdf">Exif Version 2.31</a>
 * @see <a href="https://www.cipa.jp/std/documents/e/DC-008-2012_E_C.pdf">Exif Version 2.3 (with Corrigendum at the end)</a>
 * @see <a href="https://web.archive.org/web/20051228234707id_/https://tsc.jeita.or.jp/avs/data/cp3451_1.pdf">Exif Version 2.21 (2003 draft)</a>
 * @see <a href="https://web.archive.org/web/20131018091152id_/https://exif.org/Exif2-2.PDF">Exif Version 2.2</a>
 * @see <a href="https://web.archive.org/web/20131111073619id_/https://exif.org/Exif2-1.PDF">Exif Version 2.1</a>
 */

type Exif_FieldType int
const (
	Exif_FieldType__Byte Exif_FieldType = 1
	Exif_FieldType__Ascii Exif_FieldType = 2
	Exif_FieldType__Short Exif_FieldType = 3
	Exif_FieldType__Long Exif_FieldType = 4
	Exif_FieldType__Rational Exif_FieldType = 5
	Exif_FieldType__Sbyte Exif_FieldType = 6
	Exif_FieldType__Undefined Exif_FieldType = 7
	Exif_FieldType__Sshort Exif_FieldType = 8
	Exif_FieldType__Slong Exif_FieldType = 9
	Exif_FieldType__Srational Exif_FieldType = 10
	Exif_FieldType__Float Exif_FieldType = 11
	Exif_FieldType__Double Exif_FieldType = 12
	Exif_FieldType__Ifd Exif_FieldType = 13
	Exif_FieldType__Utf8 Exif_FieldType = 129
)
var values_Exif_FieldType = map[Exif_FieldType]struct{}{1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}, 10: {}, 11: {}, 12: {}, 13: {}, 129: {}}
func (v Exif_FieldType) isDefined() bool {
	_, ok := values_Exif_FieldType[v]
	return ok
}

type Exif_GpsTag int
const (
	Exif_GpsTag__GpsVersionId Exif_GpsTag = 0
	Exif_GpsTag__GpsLatitudeRef Exif_GpsTag = 1
	Exif_GpsTag__GpsLatitude Exif_GpsTag = 2
	Exif_GpsTag__GpsLongitudeRef Exif_GpsTag = 3
	Exif_GpsTag__GpsLongitude Exif_GpsTag = 4
	Exif_GpsTag__GpsAltitudeRef Exif_GpsTag = 5
	Exif_GpsTag__GpsAltitude Exif_GpsTag = 6
	Exif_GpsTag__GpsTimeStamp Exif_GpsTag = 7
	Exif_GpsTag__GpsSatellites Exif_GpsTag = 8
	Exif_GpsTag__GpsStatus Exif_GpsTag = 9
	Exif_GpsTag__GpsMeasureMode Exif_GpsTag = 10
	Exif_GpsTag__GpsDop Exif_GpsTag = 11
	Exif_GpsTag__GpsSpeedRef Exif_GpsTag = 12
	Exif_GpsTag__GpsSpeed Exif_GpsTag = 13
	Exif_GpsTag__GpsTrackRef Exif_GpsTag = 14
	Exif_GpsTag__GpsTrack Exif_GpsTag = 15
	Exif_GpsTag__GpsImgDirectionRef Exif_GpsTag = 16
	Exif_GpsTag__GpsImgDirection Exif_GpsTag = 17
	Exif_GpsTag__GpsMapDatum Exif_GpsTag = 18
	Exif_GpsTag__GpsDestLatitudeRef Exif_GpsTag = 19
	Exif_GpsTag__GpsDestLatitude Exif_GpsTag = 20
	Exif_GpsTag__GpsDestLongitudeRef Exif_GpsTag = 21
	Exif_GpsTag__GpsDestLongitude Exif_GpsTag = 22
	Exif_GpsTag__GpsDestBearingRef Exif_GpsTag = 23
	Exif_GpsTag__GpsDestBearing Exif_GpsTag = 24
	Exif_GpsTag__GpsDestDistanceRef Exif_GpsTag = 25
	Exif_GpsTag__GpsDestDistance Exif_GpsTag = 26
	Exif_GpsTag__GpsProcessingMethod Exif_GpsTag = 27
	Exif_GpsTag__GpsAreaInformation Exif_GpsTag = 28
	Exif_GpsTag__GpsDateStamp Exif_GpsTag = 29
	Exif_GpsTag__GpsDifferential Exif_GpsTag = 30
	Exif_GpsTag__GpsHPositioningError Exif_GpsTag = 31
)
var values_Exif_GpsTag = map[Exif_GpsTag]struct{}{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: {}}
func (v Exif_GpsTag) isDefined() bool {
	_, ok := values_Exif_GpsTag[v]
	return ok
}

type Exif_Tag int
const (
	Exif_Tag__InteropIndex Exif_Tag = 1
	Exif_Tag__InteropVersion Exif_Tag = 2
	Exif_Tag__ImageWidth Exif_Tag = 256
	Exif_Tag__ImageHeight Exif_Tag = 257
	Exif_Tag__BitsPerSample Exif_Tag = 258
	Exif_Tag__Compression Exif_Tag = 259
	Exif_Tag__PhotometricInterpretation Exif_Tag = 262
	Exif_Tag__Thresholding Exif_Tag = 263
	Exif_Tag__CellWidth Exif_Tag = 264
	Exif_Tag__CellLength Exif_Tag = 265
	Exif_Tag__FillOrder Exif_Tag = 266
	Exif_Tag__DocumentName Exif_Tag = 269
	Exif_Tag__ImageDescription Exif_Tag = 270
	Exif_Tag__Make Exif_Tag = 271
	Exif_Tag__Model Exif_Tag = 272
	Exif_Tag__StripOffsets Exif_Tag = 273
	Exif_Tag__Orientation Exif_Tag = 274
	Exif_Tag__SamplesPerPixel Exif_Tag = 277
	Exif_Tag__RowsPerStrip Exif_Tag = 278
	Exif_Tag__StripByteCounts Exif_Tag = 279
	Exif_Tag__MinSampleValue Exif_Tag = 280
	Exif_Tag__MaxSampleValue Exif_Tag = 281
	Exif_Tag__XResolution Exif_Tag = 282
	Exif_Tag__YResolution Exif_Tag = 283
	Exif_Tag__PlanarConfiguration Exif_Tag = 284
	Exif_Tag__PageName Exif_Tag = 285
	Exif_Tag__XPosition Exif_Tag = 286
	Exif_Tag__YPosition Exif_Tag = 287
	Exif_Tag__FreeOffsets Exif_Tag = 288
	Exif_Tag__FreeByteCounts Exif_Tag = 289
	Exif_Tag__GrayResponseUnit Exif_Tag = 290
	Exif_Tag__GrayResponseCurve Exif_Tag = 291
	Exif_Tag__T4Options Exif_Tag = 292
	Exif_Tag__T6Options Exif_Tag = 293
	Exif_Tag__ResolutionUnit Exif_Tag = 296
	Exif_Tag__PageNumber Exif_Tag = 297
	Exif_Tag__ColorResponseUnit Exif_Tag = 300
	Exif_Tag__TransferFunction Exif_Tag = 301
	Exif_Tag__Software Exif_Tag = 305
	Exif_Tag__ModifyDate Exif_Tag = 306
	Exif_Tag__Artist Exif_Tag = 315
	Exif_Tag__HostComputer Exif_Tag = 316
	Exif_Tag__Predictor Exif_Tag = 317
	Exif_Tag__WhitePoint Exif_Tag = 318
	Exif_Tag__PrimaryChromaticities Exif_Tag = 319
	Exif_Tag__ColorMap Exif_Tag = 320
	Exif_Tag__HalftoneHints Exif_Tag = 321
	Exif_Tag__TileWidth Exif_Tag = 322
	Exif_Tag__TileLength Exif_Tag = 323
	Exif_Tag__TileOffsets Exif_Tag = 324
	Exif_Tag__TileByteCounts Exif_Tag = 325
	Exif_Tag__BadFaxLines Exif_Tag = 326
	Exif_Tag__CleanFaxData Exif_Tag = 327
	Exif_Tag__ConsecutiveBadFaxLines Exif_Tag = 328
	Exif_Tag__SubIfd Exif_Tag = 330
	Exif_Tag__InkSet Exif_Tag = 332
	Exif_Tag__InkNames Exif_Tag = 333
	Exif_Tag__NumberofInks Exif_Tag = 334
	Exif_Tag__DotRange Exif_Tag = 336
	Exif_Tag__TargetPrinter Exif_Tag = 337
	Exif_Tag__ExtraSamples Exif_Tag = 338
	Exif_Tag__SampleFormat Exif_Tag = 339
	Exif_Tag__SMinSampleValue Exif_Tag = 340
	Exif_Tag__SMaxSampleValue Exif_Tag = 341
	Exif_Tag__TransferRange Exif_Tag = 342
	Exif_Tag__ClipPath Exif_Tag = 343
	Exif_Tag__XClipPathUnits Exif_Tag = 344
	Exif_Tag__YClipPathUnits Exif_Tag = 345
	Exif_Tag__Indexed Exif_Tag = 346
	Exif_Tag__JpegTables Exif_Tag = 347
	Exif_Tag__OpiProxy Exif_Tag = 351
	Exif_Tag__GlobalParametersIfd Exif_Tag = 400
	Exif_Tag__ProfileType Exif_Tag = 401
	Exif_Tag__FaxProfile Exif_Tag = 402
	Exif_Tag__CodingMethods Exif_Tag = 403
	Exif_Tag__VersionYear Exif_Tag = 404
	Exif_Tag__ModeNumber Exif_Tag = 405
	Exif_Tag__Decode Exif_Tag = 433
	Exif_Tag__DefaultImageColor Exif_Tag = 434
	Exif_Tag__T82Options Exif_Tag = 435
	Exif_Tag__JpegTables2 Exif_Tag = 437
	Exif_Tag__JpegProc Exif_Tag = 512
	Exif_Tag__ThumbnailOffset Exif_Tag = 513
	Exif_Tag__ThumbnailLength Exif_Tag = 514
	Exif_Tag__JpegRestartInterval Exif_Tag = 515
	Exif_Tag__JpegLosslessPredictors Exif_Tag = 517
	Exif_Tag__JpegPointTransforms Exif_Tag = 518
	Exif_Tag__JpegqTables Exif_Tag = 519
	Exif_Tag__JpegdcTables Exif_Tag = 520
	Exif_Tag__JpegacTables Exif_Tag = 521
	Exif_Tag__YCbCrCoefficients Exif_Tag = 529
	Exif_Tag__YCbCrSubSampling Exif_Tag = 530
	Exif_Tag__YCbCrPositioning Exif_Tag = 531
	Exif_Tag__ReferenceBlackWhite Exif_Tag = 532
	Exif_Tag__StripRowCounts Exif_Tag = 559
	Exif_Tag__ApplicationNotes Exif_Tag = 700
	Exif_Tag__UsptoMiscellaneous Exif_Tag = 999
	Exif_Tag__RelatedImageFileFormat Exif_Tag = 4096
	Exif_Tag__RelatedImageWidth Exif_Tag = 4097
	Exif_Tag__RelatedImageHeight Exif_Tag = 4098
	Exif_Tag__Rating Exif_Tag = 18246
	Exif_Tag__XpDipXml Exif_Tag = 18247
	Exif_Tag__StitchInfo Exif_Tag = 18248
	Exif_Tag__RatingPercent Exif_Tag = 18249
	Exif_Tag__SonyRawFileType Exif_Tag = 28672
	Exif_Tag__LightFalloffParams Exif_Tag = 28722
	Exif_Tag__ChromaticAberrationCorrParams Exif_Tag = 28725
	Exif_Tag__DistortionCorrParams Exif_Tag = 28727
	Exif_Tag__ImageId Exif_Tag = 32781
	Exif_Tag__WangTag1 Exif_Tag = 32931
	Exif_Tag__WangAnnotation Exif_Tag = 32932
	Exif_Tag__WangTag3 Exif_Tag = 32933
	Exif_Tag__WangTag4 Exif_Tag = 32934
	Exif_Tag__ImageReferencePoints Exif_Tag = 32953
	Exif_Tag__RegionXformTackPoint Exif_Tag = 32954
	Exif_Tag__WarpQuadrilateral Exif_Tag = 32955
	Exif_Tag__AffineTransformMat Exif_Tag = 32956
	Exif_Tag__Matteing Exif_Tag = 32995
	Exif_Tag__DataType Exif_Tag = 32996
	Exif_Tag__ImageDepth Exif_Tag = 32997
	Exif_Tag__TileDepth Exif_Tag = 32998
	Exif_Tag__ImageFullWidth Exif_Tag = 33300
	Exif_Tag__ImageFullHeight Exif_Tag = 33301
	Exif_Tag__TextureFormat Exif_Tag = 33302
	Exif_Tag__WrapModes Exif_Tag = 33303
	Exif_Tag__FovCot Exif_Tag = 33304
	Exif_Tag__MatrixWorldToScreen Exif_Tag = 33305
	Exif_Tag__MatrixWorldToCamera Exif_Tag = 33306
	Exif_Tag__Model2 Exif_Tag = 33405
	Exif_Tag__CfaRepeatPatternDim Exif_Tag = 33421
	Exif_Tag__CfaPattern2 Exif_Tag = 33422
	Exif_Tag__BatteryLevel Exif_Tag = 33423
	Exif_Tag__KodakIfd Exif_Tag = 33424
	Exif_Tag__Copyright Exif_Tag = 33432
	Exif_Tag__ExposureTime Exif_Tag = 33434
	Exif_Tag__FNumber Exif_Tag = 33437
	Exif_Tag__MdFileTag Exif_Tag = 33445
	Exif_Tag__MdScalePixel Exif_Tag = 33446
	Exif_Tag__MdColorTable Exif_Tag = 33447
	Exif_Tag__MdLabName Exif_Tag = 33448
	Exif_Tag__MdSampleInfo Exif_Tag = 33449
	Exif_Tag__MdPrepDate Exif_Tag = 33450
	Exif_Tag__MdPrepTime Exif_Tag = 33451
	Exif_Tag__MdFileUnits Exif_Tag = 33452
	Exif_Tag__PixelScale Exif_Tag = 33550
	Exif_Tag__AdventScale Exif_Tag = 33589
	Exif_Tag__AdventRevision Exif_Tag = 33590
	Exif_Tag__Uic1Tag Exif_Tag = 33628
	Exif_Tag__Uic2Tag Exif_Tag = 33629
	Exif_Tag__Uic3Tag Exif_Tag = 33630
	Exif_Tag__Uic4Tag Exif_Tag = 33631
	Exif_Tag__IptcNaa Exif_Tag = 33723
	Exif_Tag__IntergraphPacketData Exif_Tag = 33918
	Exif_Tag__IntergraphFlagRegisters Exif_Tag = 33919
	Exif_Tag__IntergraphMatrix Exif_Tag = 33920
	Exif_Tag__IngrReserved Exif_Tag = 33921
	Exif_Tag__ModelTiePoint Exif_Tag = 33922
	Exif_Tag__Site Exif_Tag = 34016
	Exif_Tag__ColorSequence Exif_Tag = 34017
	Exif_Tag__It8Header Exif_Tag = 34018
	Exif_Tag__RasterPadding Exif_Tag = 34019
	Exif_Tag__BitsPerRunLength Exif_Tag = 34020
	Exif_Tag__BitsPerExtendedRunLength Exif_Tag = 34021
	Exif_Tag__ColorTable Exif_Tag = 34022
	Exif_Tag__ImageColorIndicator Exif_Tag = 34023
	Exif_Tag__BackgroundColorIndicator Exif_Tag = 34024
	Exif_Tag__ImageColorValue Exif_Tag = 34025
	Exif_Tag__BackgroundColorValue Exif_Tag = 34026
	Exif_Tag__PixelIntensityRange Exif_Tag = 34027
	Exif_Tag__TransparencyIndicator Exif_Tag = 34028
	Exif_Tag__ColorCharacterization Exif_Tag = 34029
	Exif_Tag__HcUsage Exif_Tag = 34030
	Exif_Tag__TrapIndicator Exif_Tag = 34031
	Exif_Tag__CmykEquivalent Exif_Tag = 34032
	Exif_Tag__SemInfo Exif_Tag = 34118
	Exif_Tag__AfcpIptc Exif_Tag = 34152
	Exif_Tag__PixelMagicJbigOptions Exif_Tag = 34232
	Exif_Tag__JplCartoIfd Exif_Tag = 34263
	Exif_Tag__ModelTransform Exif_Tag = 34264
	Exif_Tag__WbGrgbLevels Exif_Tag = 34306
	Exif_Tag__LeafData Exif_Tag = 34310
	Exif_Tag__PhotoshopSettings Exif_Tag = 34377
	Exif_Tag__ExifOffset Exif_Tag = 34665
	Exif_Tag__IccProfile Exif_Tag = 34675
	Exif_Tag__TiffFxExtensions Exif_Tag = 34687
	Exif_Tag__MultiProfiles Exif_Tag = 34688
	Exif_Tag__SharedData Exif_Tag = 34689
	Exif_Tag__T88Options Exif_Tag = 34690
	Exif_Tag__ImageLayer Exif_Tag = 34732
	Exif_Tag__GeoTiffDirectory Exif_Tag = 34735
	Exif_Tag__GeoTiffDoubleParams Exif_Tag = 34736
	Exif_Tag__GeoTiffAsciiParams Exif_Tag = 34737
	Exif_Tag__JbigOptions Exif_Tag = 34750
	Exif_Tag__ExposureProgram Exif_Tag = 34850
	Exif_Tag__SpectralSensitivity Exif_Tag = 34852
	Exif_Tag__GpsInfo Exif_Tag = 34853
	Exif_Tag__Iso Exif_Tag = 34855
	Exif_Tag__OptoElectricConvFactor Exif_Tag = 34856
	Exif_Tag__Interlace Exif_Tag = 34857
	Exif_Tag__TimeZoneOffset Exif_Tag = 34858
	Exif_Tag__SelfTimerMode Exif_Tag = 34859
	Exif_Tag__SensitivityType Exif_Tag = 34864
	Exif_Tag__StandardOutputSensitivity Exif_Tag = 34865
	Exif_Tag__RecommendedExposureIndex Exif_Tag = 34866
	Exif_Tag__IsoSpeed Exif_Tag = 34867
	Exif_Tag__IsoSpeedLatitudeyyy Exif_Tag = 34868
	Exif_Tag__IsoSpeedLatitudezzz Exif_Tag = 34869
	Exif_Tag__FaxRecvParams Exif_Tag = 34908
	Exif_Tag__FaxSubAddress Exif_Tag = 34909
	Exif_Tag__FaxRecvTime Exif_Tag = 34910
	Exif_Tag__FedexEdr Exif_Tag = 34929
	Exif_Tag__LeafSubIfd Exif_Tag = 34954
	Exif_Tag__ExifVersion Exif_Tag = 36864
	Exif_Tag__DateTimeOriginal Exif_Tag = 36867
	Exif_Tag__CreateDate Exif_Tag = 36868
	Exif_Tag__GooglePlusUploadCode Exif_Tag = 36873
	Exif_Tag__OffsetTime Exif_Tag = 36880
	Exif_Tag__OffsetTimeOriginal Exif_Tag = 36881
	Exif_Tag__OffsetTimeDigitized Exif_Tag = 36882
	Exif_Tag__ComponentsConfiguration Exif_Tag = 37121
	Exif_Tag__CompressedBitsPerPixel Exif_Tag = 37122
	Exif_Tag__ShutterSpeedValue Exif_Tag = 37377
	Exif_Tag__ApertureValue Exif_Tag = 37378
	Exif_Tag__BrightnessValue Exif_Tag = 37379
	Exif_Tag__ExposureCompensation Exif_Tag = 37380
	Exif_Tag__MaxApertureValue Exif_Tag = 37381
	Exif_Tag__SubjectDistance Exif_Tag = 37382
	Exif_Tag__MeteringMode Exif_Tag = 37383
	Exif_Tag__LightSource Exif_Tag = 37384
	Exif_Tag__Flash Exif_Tag = 37385
	Exif_Tag__FocalLength Exif_Tag = 37386
	Exif_Tag__FlashEnergy Exif_Tag = 37387
	Exif_Tag__SpatialFrequencyResponse Exif_Tag = 37388
	Exif_Tag__Noise Exif_Tag = 37389
	Exif_Tag__FocalPlaneXResolution Exif_Tag = 37390
	Exif_Tag__FocalPlaneYResolution Exif_Tag = 37391
	Exif_Tag__FocalPlaneResolutionUnit Exif_Tag = 37392
	Exif_Tag__ImageNumber Exif_Tag = 37393
	Exif_Tag__SecurityClassification Exif_Tag = 37394
	Exif_Tag__ImageHistory Exif_Tag = 37395
	Exif_Tag__SubjectArea Exif_Tag = 37396
	Exif_Tag__ExposureIndex Exif_Tag = 37397
	Exif_Tag__TiffEpStandardId Exif_Tag = 37398
	Exif_Tag__SensingMethod Exif_Tag = 37399
	Exif_Tag__Cip3DataFile Exif_Tag = 37434
	Exif_Tag__Cip3Sheet Exif_Tag = 37435
	Exif_Tag__Cip3Side Exif_Tag = 37436
	Exif_Tag__StoNits Exif_Tag = 37439
	Exif_Tag__MakerNote Exif_Tag = 37500
	Exif_Tag__UserComment Exif_Tag = 37510
	Exif_Tag__SubSecTime Exif_Tag = 37520
	Exif_Tag__SubSecTimeOriginal Exif_Tag = 37521
	Exif_Tag__SubSecTimeDigitized Exif_Tag = 37522
	Exif_Tag__MsDocumentText Exif_Tag = 37679
	Exif_Tag__MsPropertySetStorage Exif_Tag = 37680
	Exif_Tag__MsDocumentTextPosition Exif_Tag = 37681
	Exif_Tag__ImageSourceData Exif_Tag = 37724
	Exif_Tag__AmbientTemperature Exif_Tag = 37888
	Exif_Tag__Humidity Exif_Tag = 37889
	Exif_Tag__Pressure Exif_Tag = 37890
	Exif_Tag__WaterDepth Exif_Tag = 37891
	Exif_Tag__Acceleration Exif_Tag = 37892
	Exif_Tag__CameraElevationAngle Exif_Tag = 37893
	Exif_Tag__XpTitle Exif_Tag = 40091
	Exif_Tag__XpComment Exif_Tag = 40092
	Exif_Tag__XpAuthor Exif_Tag = 40093
	Exif_Tag__XpKeywords Exif_Tag = 40094
	Exif_Tag__XpSubject Exif_Tag = 40095
	Exif_Tag__FlashpixVersion Exif_Tag = 40960
	Exif_Tag__ColorSpace Exif_Tag = 40961
	Exif_Tag__ExifImageWidth Exif_Tag = 40962
	Exif_Tag__ExifImageHeight Exif_Tag = 40963
	Exif_Tag__RelatedSoundFile Exif_Tag = 40964
	Exif_Tag__InteropOffset Exif_Tag = 40965
	Exif_Tag__SamsungRawPointersOffset Exif_Tag = 40976
	Exif_Tag__SamsungRawPointersLength Exif_Tag = 40977
	Exif_Tag__SamsungRawByteOrder Exif_Tag = 41217
	Exif_Tag__SamsungRawUnknown Exif_Tag = 41218
	Exif_Tag__FlashEnergy2 Exif_Tag = 41483
	Exif_Tag__SpatialFrequencyResponse2 Exif_Tag = 41484
	Exif_Tag__Noise2 Exif_Tag = 41485
	Exif_Tag__FocalPlaneXResolution2 Exif_Tag = 41486
	Exif_Tag__FocalPlaneYResolution2 Exif_Tag = 41487
	Exif_Tag__FocalPlaneResolutionUnit2 Exif_Tag = 41488
	Exif_Tag__ImageNumber2 Exif_Tag = 41489
	Exif_Tag__SecurityClassification2 Exif_Tag = 41490
	Exif_Tag__ImageHistory2 Exif_Tag = 41491
	Exif_Tag__SubjectLocation Exif_Tag = 41492
	Exif_Tag__ExposureIndex2 Exif_Tag = 41493
	Exif_Tag__TiffEpStandardId2 Exif_Tag = 41494
	Exif_Tag__SensingMethod2 Exif_Tag = 41495
	Exif_Tag__FileSource Exif_Tag = 41728
	Exif_Tag__SceneType Exif_Tag = 41729
	Exif_Tag__CfaPattern Exif_Tag = 41730
	Exif_Tag__CustomRendered Exif_Tag = 41985
	Exif_Tag__ExposureMode Exif_Tag = 41986
	Exif_Tag__WhiteBalance Exif_Tag = 41987
	Exif_Tag__DigitalZoomRatio Exif_Tag = 41988
	Exif_Tag__FocalLengthIn35mmFormat Exif_Tag = 41989
	Exif_Tag__SceneCaptureType Exif_Tag = 41990
	Exif_Tag__GainControl Exif_Tag = 41991
	Exif_Tag__Contrast Exif_Tag = 41992
	Exif_Tag__Saturation Exif_Tag = 41993
	Exif_Tag__Sharpness Exif_Tag = 41994
	Exif_Tag__DeviceSettingDescription Exif_Tag = 41995
	Exif_Tag__SubjectDistanceRange Exif_Tag = 41996
	Exif_Tag__ImageUniqueId Exif_Tag = 42016
	Exif_Tag__OwnerName Exif_Tag = 42032
	Exif_Tag__SerialNumber Exif_Tag = 42033
	Exif_Tag__LensInfo Exif_Tag = 42034
	Exif_Tag__LensMake Exif_Tag = 42035
	Exif_Tag__LensModel Exif_Tag = 42036
	Exif_Tag__LensSerialNumber Exif_Tag = 42037
	Exif_Tag__GdalMetadata Exif_Tag = 42112
	Exif_Tag__GdalNoData Exif_Tag = 42113
	Exif_Tag__Gamma Exif_Tag = 42240
	Exif_Tag__ExpandSoftware Exif_Tag = 44992
	Exif_Tag__ExpandLens Exif_Tag = 44993
	Exif_Tag__ExpandFilm Exif_Tag = 44994
	Exif_Tag__ExpandFilterLens Exif_Tag = 44995
	Exif_Tag__ExpandScanner Exif_Tag = 44996
	Exif_Tag__ExpandFlashLamp Exif_Tag = 44997
	Exif_Tag__PixelFormat Exif_Tag = 48129
	Exif_Tag__Transformation Exif_Tag = 48130
	Exif_Tag__Uncompressed Exif_Tag = 48131
	Exif_Tag__ImageType Exif_Tag = 48132
	Exif_Tag__ImageWidth2 Exif_Tag = 48256
	Exif_Tag__ImageHeight2 Exif_Tag = 48257
	Exif_Tag__WidthResolution Exif_Tag = 48258
	Exif_Tag__HeightResolution Exif_Tag = 48259
	Exif_Tag__ImageOffset Exif_Tag = 48320
	Exif_Tag__ImageByteCount Exif_Tag = 48321
	Exif_Tag__AlphaOffset Exif_Tag = 48322
	Exif_Tag__AlphaByteCount Exif_Tag = 48323
	Exif_Tag__ImageDataDiscard Exif_Tag = 48324
	Exif_Tag__AlphaDataDiscard Exif_Tag = 48325
	Exif_Tag__OceScanjobDesc Exif_Tag = 50215
	Exif_Tag__OceApplicationSelector Exif_Tag = 50216
	Exif_Tag__OceIdNumber Exif_Tag = 50217
	Exif_Tag__OceImageLogic Exif_Tag = 50218
	Exif_Tag__Annotations Exif_Tag = 50255
	Exif_Tag__PrintIm Exif_Tag = 50341
	Exif_Tag__OriginalFileName Exif_Tag = 50547
	Exif_Tag__UsptoOriginalContentType Exif_Tag = 50560
	Exif_Tag__DngVersion Exif_Tag = 50706
	Exif_Tag__DngBackwardVersion Exif_Tag = 50707
	Exif_Tag__UniqueCameraModel Exif_Tag = 50708
	Exif_Tag__LocalizedCameraModel Exif_Tag = 50709
	Exif_Tag__CfaPlaneColor Exif_Tag = 50710
	Exif_Tag__CfaLayout Exif_Tag = 50711
	Exif_Tag__LinearizationTable Exif_Tag = 50712
	Exif_Tag__BlackLevelRepeatDim Exif_Tag = 50713
	Exif_Tag__BlackLevel Exif_Tag = 50714
	Exif_Tag__BlackLevelDeltaH Exif_Tag = 50715
	Exif_Tag__BlackLevelDeltaV Exif_Tag = 50716
	Exif_Tag__WhiteLevel Exif_Tag = 50717
	Exif_Tag__DefaultScale Exif_Tag = 50718
	Exif_Tag__DefaultCropOrigin Exif_Tag = 50719
	Exif_Tag__DefaultCropSize Exif_Tag = 50720
	Exif_Tag__ColorMatrix1 Exif_Tag = 50721
	Exif_Tag__ColorMatrix2 Exif_Tag = 50722
	Exif_Tag__CameraCalibration1 Exif_Tag = 50723
	Exif_Tag__CameraCalibration2 Exif_Tag = 50724
	Exif_Tag__ReductionMatrix1 Exif_Tag = 50725
	Exif_Tag__ReductionMatrix2 Exif_Tag = 50726
	Exif_Tag__AnalogBalance Exif_Tag = 50727
	Exif_Tag__AsShotNeutral Exif_Tag = 50728
	Exif_Tag__AsShotWhiteXy Exif_Tag = 50729
	Exif_Tag__BaselineExposure Exif_Tag = 50730
	Exif_Tag__BaselineNoise Exif_Tag = 50731
	Exif_Tag__BaselineSharpness Exif_Tag = 50732
	Exif_Tag__BayerGreenSplit Exif_Tag = 50733
	Exif_Tag__LinearResponseLimit Exif_Tag = 50734
	Exif_Tag__CameraSerialNumber Exif_Tag = 50735
	Exif_Tag__DngLensInfo Exif_Tag = 50736
	Exif_Tag__ChromaBlurRadius Exif_Tag = 50737
	Exif_Tag__AntiAliasStrength Exif_Tag = 50738
	Exif_Tag__ShadowScale Exif_Tag = 50739
	Exif_Tag__Sr2Private Exif_Tag = 50740
	Exif_Tag__MakerNoteSafety Exif_Tag = 50741
	Exif_Tag__RawImageSegmentation Exif_Tag = 50752
	Exif_Tag__CalibrationIlluminant1 Exif_Tag = 50778
	Exif_Tag__CalibrationIlluminant2 Exif_Tag = 50779
	Exif_Tag__BestQualityScale Exif_Tag = 50780
	Exif_Tag__RawDataUniqueId Exif_Tag = 50781
	Exif_Tag__AliasLayerMetadata Exif_Tag = 50784
	Exif_Tag__OriginalRawFileName Exif_Tag = 50827
	Exif_Tag__OriginalRawFileData Exif_Tag = 50828
	Exif_Tag__ActiveArea Exif_Tag = 50829
	Exif_Tag__MaskedAreas Exif_Tag = 50830
	Exif_Tag__AsShotIccProfile Exif_Tag = 50831
	Exif_Tag__AsShotPreProfileMatrix Exif_Tag = 50832
	Exif_Tag__CurrentIccProfile Exif_Tag = 50833
	Exif_Tag__CurrentPreProfileMatrix Exif_Tag = 50834
	Exif_Tag__ColorimetricReference Exif_Tag = 50879
	Exif_Tag__SRawType Exif_Tag = 50885
	Exif_Tag__PanasonicTitle Exif_Tag = 50898
	Exif_Tag__PanasonicTitle2 Exif_Tag = 50899
	Exif_Tag__CameraCalibrationSig Exif_Tag = 50931
	Exif_Tag__ProfileCalibrationSig Exif_Tag = 50932
	Exif_Tag__ProfileIfd Exif_Tag = 50933
	Exif_Tag__AsShotProfileName Exif_Tag = 50934
	Exif_Tag__NoiseReductionApplied Exif_Tag = 50935
	Exif_Tag__ProfileName Exif_Tag = 50936
	Exif_Tag__ProfileHueSatMapDims Exif_Tag = 50937
	Exif_Tag__ProfileHueSatMapData1 Exif_Tag = 50938
	Exif_Tag__ProfileHueSatMapData2 Exif_Tag = 50939
	Exif_Tag__ProfileToneCurve Exif_Tag = 50940
	Exif_Tag__ProfileEmbedPolicy Exif_Tag = 50941
	Exif_Tag__ProfileCopyright Exif_Tag = 50942
	Exif_Tag__ForwardMatrix1 Exif_Tag = 50964
	Exif_Tag__ForwardMatrix2 Exif_Tag = 50965
	Exif_Tag__PreviewApplicationName Exif_Tag = 50966
	Exif_Tag__PreviewApplicationVersion Exif_Tag = 50967
	Exif_Tag__PreviewSettingsName Exif_Tag = 50968
	Exif_Tag__PreviewSettingsDigest Exif_Tag = 50969
	Exif_Tag__PreviewColorSpace Exif_Tag = 50970
	Exif_Tag__PreviewDateTime Exif_Tag = 50971
	Exif_Tag__RawImageDigest Exif_Tag = 50972
	Exif_Tag__OriginalRawFileDigest Exif_Tag = 50973
	Exif_Tag__SubTileBlockSize Exif_Tag = 50974
	Exif_Tag__RowInterleaveFactor Exif_Tag = 50975
	Exif_Tag__ProfileLookTableDims Exif_Tag = 50981
	Exif_Tag__ProfileLookTableData Exif_Tag = 50982
	Exif_Tag__OpcodeList1 Exif_Tag = 51008
	Exif_Tag__OpcodeList2 Exif_Tag = 51009
	Exif_Tag__OpcodeList3 Exif_Tag = 51022
	Exif_Tag__NoiseProfile Exif_Tag = 51041
	Exif_Tag__TimeCodes Exif_Tag = 51043
	Exif_Tag__FrameRate Exif_Tag = 51044
	Exif_Tag__TStop Exif_Tag = 51058
	Exif_Tag__ReelName Exif_Tag = 51081
	Exif_Tag__OriginalDefaultFinalSize Exif_Tag = 51089
	Exif_Tag__OriginalBestQualitySize Exif_Tag = 51090
	Exif_Tag__OriginalDefaultCropSize Exif_Tag = 51091
	Exif_Tag__CameraLabel Exif_Tag = 51105
	Exif_Tag__ProfileHueSatMapEncoding Exif_Tag = 51107
	Exif_Tag__ProfileLookTableEncoding Exif_Tag = 51108
	Exif_Tag__BaselineExposureOffset Exif_Tag = 51109
	Exif_Tag__DefaultBlackRender Exif_Tag = 51110
	Exif_Tag__NewRawImageDigest Exif_Tag = 51111
	Exif_Tag__RawToPreviewGain Exif_Tag = 51112
	Exif_Tag__DefaultUserCrop Exif_Tag = 51125
	Exif_Tag__Padding Exif_Tag = 59932
	Exif_Tag__OffsetSchema Exif_Tag = 59933
	Exif_Tag__OwnerName2 Exif_Tag = 65000
	Exif_Tag__SerialNumber2 Exif_Tag = 65001
	Exif_Tag__Lens Exif_Tag = 65002
	Exif_Tag__KdcIfd Exif_Tag = 65024
	Exif_Tag__RawFile Exif_Tag = 65100
	Exif_Tag__Converter Exif_Tag = 65101
	Exif_Tag__WhiteBalance2 Exif_Tag = 65102
	Exif_Tag__Exposure Exif_Tag = 65105
	Exif_Tag__Shadows Exif_Tag = 65106
	Exif_Tag__Brightness Exif_Tag = 65107
	Exif_Tag__Contrast2 Exif_Tag = 65108
	Exif_Tag__Saturation2 Exif_Tag = 65109
	Exif_Tag__Sharpness2 Exif_Tag = 65110
	Exif_Tag__Smoothness Exif_Tag = 65111
	Exif_Tag__MoireFilter Exif_Tag = 65112
)
var values_Exif_Tag = map[Exif_Tag]struct{}{1: {}, 2: {}, 256: {}, 257: {}, 258: {}, 259: {}, 262: {}, 263: {}, 264: {}, 265: {}, 266: {}, 269: {}, 270: {}, 271: {}, 272: {}, 273: {}, 274: {}, 277: {}, 278: {}, 279: {}, 280: {}, 281: {}, 282: {}, 283: {}, 284: {}, 285: {}, 286: {}, 287: {}, 288: {}, 289: {}, 290: {}, 291: {}, 292: {}, 293: {}, 296: {}, 297: {}, 300: {}, 301: {}, 305: {}, 306: {}, 315: {}, 316: {}, 317: {}, 318: {}, 319: {}, 320: {}, 321: {}, 322: {}, 323: {}, 324: {}, 325: {}, 326: {}, 327: {}, 328: {}, 330: {}, 332: {}, 333: {}, 334: {}, 336: {}, 337: {}, 338: {}, 339: {}, 340: {}, 341: {}, 342: {}, 343: {}, 344: {}, 345: {}, 346: {}, 347: {}, 351: {}, 400: {}, 401: {}, 402: {}, 403: {}, 404: {}, 405: {}, 433: {}, 434: {}, 435: {}, 437: {}, 512: {}, 513: {}, 514: {}, 515: {}, 517: {}, 518: {}, 519: {}, 520: {}, 521: {}, 529: {}, 530: {}, 531: {}, 532: {}, 559: {}, 700: {}, 999: {}, 4096: {}, 4097: {}, 4098: {}, 18246: {}, 18247: {}, 18248: {}, 18249: {}, 28672: {}, 28722: {}, 28725: {}, 28727: {}, 32781: {}, 32931: {}, 32932: {}, 32933: {}, 32934: {}, 32953: {}, 32954: {}, 32955: {}, 32956: {}, 32995: {}, 32996: {}, 32997: {}, 32998: {}, 33300: {}, 33301: {}, 33302: {}, 33303: {}, 33304: {}, 33305: {}, 33306: {}, 33405: {}, 33421: {}, 33422: {}, 33423: {}, 33424: {}, 33432: {}, 33434: {}, 33437: {}, 33445: {}, 33446: {}, 33447: {}, 33448: {}, 33449: {}, 33450: {}, 33451: {}, 33452: {}, 33550: {}, 33589: {}, 33590: {}, 33628: {}, 33629: {}, 33630: {}, 33631: {}, 33723: {}, 33918: {}, 33919: {}, 33920: {}, 33921: {}, 33922: {}, 34016: {}, 34017: {}, 34018: {}, 34019: {}, 34020: {}, 34021: {}, 34022: {}, 34023: {}, 34024: {}, 34025: {}, 34026: {}, 34027: {}, 34028: {}, 34029: {}, 34030: {}, 34031: {}, 34032: {}, 34118: {}, 34152: {}, 34232: {}, 34263: {}, 34264: {}, 34306: {}, 34310: {}, 34377: {}, 34665: {}, 34675: {}, 34687: {}, 34688: {}, 34689: {}, 34690: {}, 34732: {}, 34735: {}, 34736: {}, 34737: {}, 34750: {}, 34850: {}, 34852: {}, 34853: {}, 34855: {}, 34856: {}, 34857: {}, 34858: {}, 34859: {}, 34864: {}, 34865: {}, 34866: {}, 34867: {}, 34868: {}, 34869: {}, 34908: {}, 34909: {}, 34910: {}, 34929: {}, 34954: {}, 36864: {}, 36867: {}, 36868: {}, 36873: {}, 36880: {}, 36881: {}, 36882: {}, 37121: {}, 37122: {}, 37377: {}, 37378: {}, 37379: {}, 37380: {}, 37381: {}, 37382: {}, 37383: {}, 37384: {}, 37385: {}, 37386: {}, 37387: {}, 37388: {}, 37389: {}, 37390: {}, 37391: {}, 37392: {}, 37393: {}, 37394: {}, 37395: {}, 37396: {}, 37397: {}, 37398: {}, 37399: {}, 37434: {}, 37435: {}, 37436: {}, 37439: {}, 37500: {}, 37510: {}, 37520: {}, 37521: {}, 37522: {}, 37679: {}, 37680: {}, 37681: {}, 37724: {}, 37888: {}, 37889: {}, 37890: {}, 37891: {}, 37892: {}, 37893: {}, 40091: {}, 40092: {}, 40093: {}, 40094: {}, 40095: {}, 40960: {}, 40961: {}, 40962: {}, 40963: {}, 40964: {}, 40965: {}, 40976: {}, 40977: {}, 41217: {}, 41218: {}, 41483: {}, 41484: {}, 41485: {}, 41486: {}, 41487: {}, 41488: {}, 41489: {}, 41490: {}, 41491: {}, 41492: {}, 41493: {}, 41494: {}, 41495: {}, 41728: {}, 41729: {}, 41730: {}, 41985: {}, 41986: {}, 41987: {}, 41988: {}, 41989: {}, 41990: {}, 41991: {}, 41992: {}, 41993: {}, 41994: {}, 41995: {}, 41996: {}, 42016: {}, 42032: {}, 42033: {}, 42034: {}, 42035: {}, 42036: {}, 42037: {}, 42112: {}, 42113: {}, 42240: {}, 44992: {}, 44993: {}, 44994: {}, 44995: {}, 44996: {}, 44997: {}, 48129: {}, 48130: {}, 48131: {}, 48132: {}, 48256: {}, 48257: {}, 48258: {}, 48259: {}, 48320: {}, 48321: {}, 48322: {}, 48323: {}, 48324: {}, 48325: {}, 50215: {}, 50216: {}, 50217: {}, 50218: {}, 50255: {}, 50341: {}, 50547: {}, 50560: {}, 50706: {}, 50707: {}, 50708: {}, 50709: {}, 50710: {}, 50711: {}, 50712: {}, 50713: {}, 50714: {}, 50715: {}, 50716: {}, 50717: {}, 50718: {}, 50719: {}, 50720: {}, 50721: {}, 50722: {}, 50723: {}, 50724: {}, 50725: {}, 50726: {}, 50727: {}, 50728: {}, 50729: {}, 50730: {}, 50731: {}, 50732: {}, 50733: {}, 50734: {}, 50735: {}, 50736: {}, 50737: {}, 50738: {}, 50739: {}, 50740: {}, 50741: {}, 50752: {}, 50778: {}, 50779: {}, 50780: {}, 50781: {}, 50784: {}, 50827: {}, 50828: {}, 50829: {}, 50830: {}, 50831: {}, 50832: {}, 50833: {}, 50834: {}, 50879: {}, 50885: {}, 50898: {}, 50899: {}, 50931: {}, 50932: {}, 50933: {}, 50934: {}, 50935: {}, 50936: {}, 50937: {}, 50938: {}, 50939: {}, 50940: {}, 50941: {}, 50942: {}, 50964: {}, 50965: {}, 50966: {}, 50967: {}, 50968: {}, 50969: {}, 50970: {}, 50971: {}, 50972: {}, 50973: {}, 50974: {}, 50975: {}, 50981: {}, 50982: {}, 51008: {}, 51009: {}, 51022: {}, 51041: {}, 51043: {}, 51044: {}, 51058: {}, 51081: {}, 51089: {}, 51090: {}, 51091: {}, 51105: {}, 51107: {}, 51108: {}, 51109: {}, 51110: {}, 51111: {}, 51112: {}, 51125: {}, 59932: {}, 59933: {}, 65000: {}, 65001: {}, 65002: {}, 65024: {}, 65100: {}, 65101: {}, 65102: {}, 65105: {}, 65106: {}, 65107: {}, 65108: {}, 65109: {}, 65110: {}, 65111: {}, 65112: {}}
func (v Exif_Tag) isDefined() bool {
	_, ok := values_Exif_Tag[v]
	return ok
}
type Exif struct {
	Endianness uint16
	Body *Exif_ExifBody
	_io *kaitai.Stream
	_root *Exif
	_parent kaitai.Struct
}
func NewExif() *Exif {
	return &Exif{
	}
}

func (this Exif) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif) Read(io *kaitai.Stream, parent kaitai.Struct, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root

	tmp1, err := this._io.ReadU2le()
	if err != nil {
		return err
	}
	this.Endianness = uint16(tmp1)
	tmp2 := NewExif_ExifBody()
	err = tmp2.Read(this._io, this, this._root)
	if err != nil {
		return err
	}
	this.Body = tmp2
	return err
}
type Exif_ExifBody struct {
	Magic uint16
	OfsIfd0 uint32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif
	_f_ifd0 bool
	ifd0 *Exif_ExifBody_Ifd
	_is_le int
}
func NewExif_ExifBody() *Exif_ExifBody {
	return &Exif_ExifBody{
	}
}

func (this Exif_ExifBody) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody) Read(io *kaitai.Stream, parent *Exif, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = -1

	switch (this._root.Endianness) {
	case 18761:
		this._is_le = int(1)
	case 19789:
		this._is_le = int(0)
	}

	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody) _read_le() (err error) {
	tmp3, err := this._io.ReadU2le()
	if err != nil {
		return err
	}
	this.Magic = uint16(tmp3)
	if !(this.Magic == 42) {
		return kaitai.NewValidationNotEqualError(42, this.Magic, this._io, "/types/exif_body/seq/0")
	}
	tmp4, err := this._io.ReadU4le()
	if err != nil {
		return err
	}
	this.OfsIfd0 = uint32(tmp4)
	return err
}

func (this *Exif_ExifBody) _read_be() (err error) {
	tmp5, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.Magic = uint16(tmp5)
	if !(this.Magic == 42) {
		return kaitai.NewValidationNotEqualError(42, this.Magic, this._io, "/types/exif_body/seq/0")
	}
	tmp6, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.OfsIfd0 = uint32(tmp6)
	return err
}
func (this *Exif_ExifBody) Ifd0() (v *Exif_ExifBody_Ifd, err error) {
	if (this._f_ifd0) {
		return this.ifd0, nil
	}
	this._f_ifd0 = true
	_pos, err := this._io.Pos()
	if err != nil {
		return nil, err
	}
	_, err = this._io.Seek(int64(this.OfsIfd0), io.SeekStart)
	if err != nil {
		return nil, err
	}
	switch this._is_le {
	case 0:
		tmp7 := NewExif_ExifBody_Ifd(false)
		err = tmp7.Read(this._io, this, this._root)
		if err != nil {
			return nil, err
		}
		this.ifd0 = tmp7
	case 1:
		tmp8 := NewExif_ExifBody_Ifd(false)
		err = tmp8.Read(this._io, this, this._root)
		if err != nil {
			return nil, err
		}
		this.ifd0 = tmp8
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	_, err = this._io.Seek(_pos, io.SeekStart)
	if err != nil {
		return nil, err
	}
	return this.ifd0, nil
}
type Exif_ExifBody_AsciiString struct {
	Value []byte
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_AsciiString() *Exif_ExifBody_AsciiString {
	return &Exif_ExifBody_AsciiString{
	}
}

func (this Exif_ExifBody_AsciiString) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_AsciiString) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_AsciiString) _read_le() (err error) {
	tmp9, err := this._io.ReadBytesTerm(0, false, true, false)
	if err != nil {
		return err
	}
	this.Value = tmp9
	return err
}

func (this *Exif_ExifBody_AsciiString) _read_be() (err error) {
	tmp10, err := this._io.ReadBytesTerm(0, false, true, false)
	if err != nil {
		return err
	}
	this.Value = tmp10
	return err
}

/**
 * According to the core Exif standard, this should be ASCII, but in
 * practice, this is not always the case. From
 * [ExifTool FAQ](https://exiftool.sourceforge.net/faq.html#Q10):
 * 
 * > However, it is not uncommon for applications to write UTF-8 or
 * other encodings where ASCII is expected.
 * 
 * Therefore, this field is a byte array, not a string. This is to
 * avoid non-ASCII characters being treated as errors in some target
 * languages, such as Python. The only assumption is that a null byte
 * terminates the value (although sometimes the null byte is missing,
 * which we tolerate thanks to the `eos-error: false` setting).
 * 
 * Here is a sample JPEG file with a `tag::image_description` IFD
 * field of type `field_type::ascii` that actually contains UTF-8:
 * <https://github.com/Exiv2/exiv2/blob/2cd987a731236037b6b78cbff897d08685a8ef49/test/data/exiv2-bug501.jpg>
 * 
 * It seems that most modern applications (e.g. GIMP 3.0.6) always
 * use UTF-8 when storing Exif metadata. However, there are also
 * files with a non-UTF-8 encoding, for example
 * <https://github.com/drewnoakes/metadata-extractor-images/blob/651ad0e67aa8d43d358ad05f9bc07b52d8b9ac6e/jpg/Ricoh%20DC-3Z%20(low%20res).jpg>
 * has a `tag::copyright` IFD field with a value encoded in
 * ISO-8859-1 (Latin-1).
 */
type Exif_ExifBody_Doubles struct {
	Values []float64
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Doubles() *Exif_ExifBody_Doubles {
	return &Exif_ExifBody_Doubles{
	}
}

func (this Exif_ExifBody_Doubles) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Doubles) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Doubles) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp11, err := this._io.ReadF8le()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp11)
	}
	return err
}

func (this *Exif_ExifBody_Doubles) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp12, err := this._io.ReadF8be()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp12)
	}
	return err
}
type Exif_ExifBody_Floats struct {
	Values []float32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Floats() *Exif_ExifBody_Floats {
	return &Exif_ExifBody_Floats{
	}
}

func (this Exif_ExifBody_Floats) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Floats) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Floats) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp13, err := this._io.ReadF4le()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp13)
	}
	return err
}

func (this *Exif_ExifBody_Floats) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp14, err := this._io.ReadF4be()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp14)
	}
	return err
}
type Exif_ExifBody_Ifd struct {
	NumFields uint16
	Fields []*Exif_ExifBody_IfdField
	OfsNextIfd uint32
	IsGpsIfd bool
	_io *kaitai.Stream
	_root *Exif
	_parent kaitai.Struct
	_raw_Fields [][]byte
	_f_nextIfd bool
	nextIfd *Exif_ExifBody_Ifd
	_is_le int
}
func NewExif_ExifBody_Ifd(isGpsIfd bool) *Exif_ExifBody_Ifd {
	return &Exif_ExifBody_Ifd{
		IsGpsIfd: isGpsIfd,
	}
}

func (this Exif_ExifBody_Ifd) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Ifd) Read(io *kaitai.Stream, parent kaitai.Struct, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Ifd) _read_le() (err error) {
	tmp15, err := this._io.ReadU2le()
	if err != nil {
		return err
	}
	this.NumFields = uint16(tmp15)
	for i := 0; i < int(this.NumFields); i++ {
		_ = i
		tmp16, err := this._io.ReadBytes(int(12))
		if err != nil {
			return err
		}
		tmp16 = tmp16
		this._raw_Fields = append(this._raw_Fields, tmp16)
		_io__raw_Fields := kaitai.NewStream(bytes.NewReader(this._raw_Fields[i]))
		tmp17 := NewExif_ExifBody_IfdField()
		err = tmp17.Read(_io__raw_Fields, this, this._root)
		if err != nil {
			return err
		}
		this.Fields = append(this.Fields, tmp17)
	}
	tmp18, err := this._io.ReadU4le()
	if err != nil {
		return err
	}
	this.OfsNextIfd = uint32(tmp18)
	return err
}

func (this *Exif_ExifBody_Ifd) _read_be() (err error) {
	tmp19, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.NumFields = uint16(tmp19)
	for i := 0; i < int(this.NumFields); i++ {
		_ = i
		tmp20, err := this._io.ReadBytes(int(12))
		if err != nil {
			return err
		}
		tmp20 = tmp20
		this._raw_Fields = append(this._raw_Fields, tmp20)
		_io__raw_Fields := kaitai.NewStream(bytes.NewReader(this._raw_Fields[i]))
		tmp21 := NewExif_ExifBody_IfdField()
		err = tmp21.Read(_io__raw_Fields, this, this._root)
		if err != nil {
			return err
		}
		this.Fields = append(this.Fields, tmp21)
	}
	tmp22, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.OfsNextIfd = uint32(tmp22)
	return err
}
func (this *Exif_ExifBody_Ifd) NextIfd() (v *Exif_ExifBody_Ifd, err error) {
	if (this._f_nextIfd) {
		return this.nextIfd, nil
	}
	this._f_nextIfd = true
	if (this.OfsNextIfd != 0) {
		_pos, err := this._io.Pos()
		if err != nil {
			return nil, err
		}
		_, err = this._io.Seek(int64(this.OfsNextIfd), io.SeekStart)
		if err != nil {
			return nil, err
		}
		switch this._is_le {
		case 0:
			tmp23 := NewExif_ExifBody_Ifd(this.IsGpsIfd)
			err = tmp23.Read(this._io, this, this._root)
			if err != nil {
				return nil, err
			}
			this.nextIfd = tmp23
		case 1:
			tmp24 := NewExif_ExifBody_Ifd(this.IsGpsIfd)
			err = tmp24.Read(this._io, this, this._root)
			if err != nil {
				return nil, err
			}
			this.nextIfd = tmp24
		default:
			err = kaitai.UndecidedEndiannessError{}
		}
		_, err = this._io.Seek(_pos, io.SeekStart)
		if err != nil {
			return nil, err
		}
	}
	return this.nextIfd, nil
}
type Exif_ExifBody_IfdField struct {
	TagRaw uint16
	FieldType Exif_FieldType
	NumValues uint32
	OfsData uint32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_Ifd
	_raw_data []byte
	_f_bytesPerValue bool
	bytesPerValue int8
	_f_data bool
	data interface{}
	_f_gpsTag bool
	gpsTag Exif_GpsTag
	_f_hasImmediateData bool
	hasImmediateData bool
	_f_lenData bool
	lenData int
	_f_subIfd bool
	subIfd *Exif_ExifBody_Ifd
	_f_tag bool
	tag Exif_Tag
	_is_le int
}
func NewExif_ExifBody_IfdField() *Exif_ExifBody_IfdField {
	return &Exif_ExifBody_IfdField{
	}
}

func (this Exif_ExifBody_IfdField) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_IfdField) Read(io *kaitai.Stream, parent *Exif_ExifBody_Ifd, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_IfdField) _read_le() (err error) {
	tmp25, err := this._io.ReadU2le()
	if err != nil {
		return err
	}
	this.TagRaw = uint16(tmp25)
	tmp26, err := this._io.ReadU2le()
	if err != nil {
		return err
	}
	this.FieldType = Exif_FieldType(tmp26)
	tmp27, err := this._io.ReadU4le()
	if err != nil {
		return err
	}
	this.NumValues = uint32(tmp27)
	tmp28, err := this.HasImmediateData()
	if err != nil {
		return err
	}
	if (!(tmp28)) {
		tmp29, err := this._io.ReadU4le()
		if err != nil {
			return err
		}
		this.OfsData = uint32(tmp29)
	}
	return err
}

func (this *Exif_ExifBody_IfdField) _read_be() (err error) {
	tmp30, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.TagRaw = uint16(tmp30)
	tmp31, err := this._io.ReadU2be()
	if err != nil {
		return err
	}
	this.FieldType = Exif_FieldType(tmp31)
	tmp32, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.NumValues = uint32(tmp32)
	tmp33, err := this.HasImmediateData()
	if err != nil {
		return err
	}
	if (!(tmp33)) {
		tmp34, err := this._io.ReadU4be()
		if err != nil {
			return err
		}
		this.OfsData = uint32(tmp34)
	}
	return err
}

/**
 * Size in bytes of a single value of type `field_type`, or 0 if
 * `field_type` is not one of the known types (in which case the size
 * cannot be determined and `data` will be empty).
 * @see <a href="https://www.media.mit.edu/pia/Research/deepview/exif.html#DataForm">Source</a>
 */
func (this *Exif_ExifBody_IfdField) BytesPerValue() (v int8, err error) {
	if (this._f_bytesPerValue) {
		return this.bytesPerValue, nil
	}
	this._f_bytesPerValue = true
	var tmp35 int8;
	if ( ((this.FieldType == Exif_FieldType__Byte) || (this.FieldType == Exif_FieldType__Ascii) || (this.FieldType == Exif_FieldType__Sbyte) || (this.FieldType == Exif_FieldType__Undefined) || (this.FieldType == Exif_FieldType__Utf8)) ) {
		tmp35 = 1
	} else {
		var tmp36 int8;
		if ( ((this.FieldType == Exif_FieldType__Short) || (this.FieldType == Exif_FieldType__Sshort)) ) {
			tmp36 = 2
		} else {
			var tmp37 int8;
			if ( ((this.FieldType == Exif_FieldType__Long) || (this.FieldType == Exif_FieldType__Slong) || (this.FieldType == Exif_FieldType__Float) || (this.FieldType == Exif_FieldType__Ifd)) ) {
				tmp37 = 4
			} else {
				var tmp38 int8;
				if ( ((this.FieldType == Exif_FieldType__Rational) || (this.FieldType == Exif_FieldType__Srational) || (this.FieldType == Exif_FieldType__Double)) ) {
					tmp38 = 8
				} else {
					tmp38 = 0
				}
				tmp37 = tmp38
			}
			tmp36 = tmp37
		}
		tmp35 = tmp36
	}
	this.bytesPerValue = int8(tmp35)
	return this.bytesPerValue, nil
}
func (this *Exif_ExifBody_IfdField) Data() (v interface{}, err error) {
	if (this._f_data) {
		return this.data, nil
	}
	this._f_data = true
	var tmp39 *kaitai.Stream;
	tmp40, err := this.HasImmediateData()
	if err != nil {
		return nil, err
	}
	if (tmp40) {
		tmp39 = this._io
	} else {
		tmp39 = this._root._io
	}
	thisIo := tmp39
	_pos, err := thisIo.Pos()
	if err != nil {
		return nil, err
	}
	var tmp41 int8;
	tmp42, err := this.HasImmediateData()
	if err != nil {
		return nil, err
	}
	if (tmp42) {
		tmp41 = 8
	} else {
		tmp41 = this.OfsData
	}
	_, err = thisIo.Seek(int64(tmp41), io.SeekStart)
	if err != nil {
		return nil, err
	}
	switch this._is_le {
	case 0:
		switch (this.FieldType) {
		case Exif_FieldType__Ascii:
			tmp43, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp44, err := thisIo.ReadBytes(int(tmp43))
			if err != nil {
				return nil, err
			}
			tmp44 = tmp44
			this._raw_data = tmp44
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp45 := NewExif_ExifBody_AsciiString()
			err = tmp45.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp45
		case Exif_FieldType__Double:
			tmp46, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp47, err := thisIo.ReadBytes(int(tmp46))
			if err != nil {
				return nil, err
			}
			tmp47 = tmp47
			this._raw_data = tmp47
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp48 := NewExif_ExifBody_Doubles()
			err = tmp48.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp48
		case Exif_FieldType__Float:
			tmp49, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp50, err := thisIo.ReadBytes(int(tmp49))
			if err != nil {
				return nil, err
			}
			tmp50 = tmp50
			this._raw_data = tmp50
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp51 := NewExif_ExifBody_Floats()
			err = tmp51.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp51
		case Exif_FieldType__Ifd:
			tmp52, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp53, err := thisIo.ReadBytes(int(tmp52))
			if err != nil {
				return nil, err
			}
			tmp53 = tmp53
			this._raw_data = tmp53
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp54 := NewExif_ExifBody_Longs()
			err = tmp54.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp54
		case Exif_FieldType__Long:
			tmp55, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp56, err := thisIo.ReadBytes(int(tmp55))
			if err != nil {
				return nil, err
			}
			tmp56 = tmp56
			this._raw_data = tmp56
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp57 := NewExif_ExifBody_Longs()
			err = tmp57.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp57
		case Exif_FieldType__Rational:
			tmp58, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp59, err := thisIo.ReadBytes(int(tmp58))
			if err != nil {
				return nil, err
			}
			tmp59 = tmp59
			this._raw_data = tmp59
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp60 := NewExif_ExifBody_Rationals()
			err = tmp60.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp60
		case Exif_FieldType__Sbyte:
			tmp61, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp62, err := thisIo.ReadBytes(int(tmp61))
			if err != nil {
				return nil, err
			}
			tmp62 = tmp62
			this._raw_data = tmp62
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp63 := NewExif_ExifBody_Sbytes()
			err = tmp63.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp63
		case Exif_FieldType__Short:
			tmp64, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp65, err := thisIo.ReadBytes(int(tmp64))
			if err != nil {
				return nil, err
			}
			tmp65 = tmp65
			this._raw_data = tmp65
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp66 := NewExif_ExifBody_Shorts()
			err = tmp66.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp66
		case Exif_FieldType__Slong:
			tmp67, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp68, err := thisIo.ReadBytes(int(tmp67))
			if err != nil {
				return nil, err
			}
			tmp68 = tmp68
			this._raw_data = tmp68
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp69 := NewExif_ExifBody_Slongs()
			err = tmp69.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp69
		case Exif_FieldType__Srational:
			tmp70, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp71, err := thisIo.ReadBytes(int(tmp70))
			if err != nil {
				return nil, err
			}
			tmp71 = tmp71
			this._raw_data = tmp71
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp72 := NewExif_ExifBody_Srationals()
			err = tmp72.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp72
		case Exif_FieldType__Sshort:
			tmp73, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp74, err := thisIo.ReadBytes(int(tmp73))
			if err != nil {
				return nil, err
			}
			tmp74 = tmp74
			this._raw_data = tmp74
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp75 := NewExif_ExifBody_Sshorts()
			err = tmp75.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp75
		case Exif_FieldType__Utf8:
			tmp76, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp77, err := thisIo.ReadBytes(int(tmp76))
			if err != nil {
				return nil, err
			}
			tmp77 = tmp77
			this._raw_data = tmp77
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp78 := NewExif_ExifBody_Utf8String()
			err = tmp78.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp78
		default:
			tmp79, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp80, err := thisIo.ReadBytes(int(tmp79))
			if err != nil {
				return nil, err
			}
			tmp80 = tmp80
			this._raw_data = tmp80
		}
	case 1:
		switch (this.FieldType) {
		case Exif_FieldType__Ascii:
			tmp81, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp82, err := thisIo.ReadBytes(int(tmp81))
			if err != nil {
				return nil, err
			}
			tmp82 = tmp82
			this._raw_data = tmp82
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp83 := NewExif_ExifBody_AsciiString()
			err = tmp83.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp83
		case Exif_FieldType__Double:
			tmp84, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp85, err := thisIo.ReadBytes(int(tmp84))
			if err != nil {
				return nil, err
			}
			tmp85 = tmp85
			this._raw_data = tmp85
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp86 := NewExif_ExifBody_Doubles()
			err = tmp86.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp86
		case Exif_FieldType__Float:
			tmp87, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp88, err := thisIo.ReadBytes(int(tmp87))
			if err != nil {
				return nil, err
			}
			tmp88 = tmp88
			this._raw_data = tmp88
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp89 := NewExif_ExifBody_Floats()
			err = tmp89.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp89
		case Exif_FieldType__Ifd:
			tmp90, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp91, err := thisIo.ReadBytes(int(tmp90))
			if err != nil {
				return nil, err
			}
			tmp91 = tmp91
			this._raw_data = tmp91
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp92 := NewExif_ExifBody_Longs()
			err = tmp92.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp92
		case Exif_FieldType__Long:
			tmp93, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp94, err := thisIo.ReadBytes(int(tmp93))
			if err != nil {
				return nil, err
			}
			tmp94 = tmp94
			this._raw_data = tmp94
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp95 := NewExif_ExifBody_Longs()
			err = tmp95.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp95
		case Exif_FieldType__Rational:
			tmp96, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp97, err := thisIo.ReadBytes(int(tmp96))
			if err != nil {
				return nil, err
			}
			tmp97 = tmp97
			this._raw_data = tmp97
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp98 := NewExif_ExifBody_Rationals()
			err = tmp98.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp98
		case Exif_FieldType__Sbyte:
			tmp99, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp100, err := thisIo.ReadBytes(int(tmp99))
			if err != nil {
				return nil, err
			}
			tmp100 = tmp100
			this._raw_data = tmp100
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp101 := NewExif_ExifBody_Sbytes()
			err = tmp101.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp101
		case Exif_FieldType__Short:
			tmp102, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp103, err := thisIo.ReadBytes(int(tmp102))
			if err != nil {
				return nil, err
			}
			tmp103 = tmp103
			this._raw_data = tmp103
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp104 := NewExif_ExifBody_Shorts()
			err = tmp104.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp104
		case Exif_FieldType__Slong:
			tmp105, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp106, err := thisIo.ReadBytes(int(tmp105))
			if err != nil {
				return nil, err
			}
			tmp106 = tmp106
			this._raw_data = tmp106
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp107 := NewExif_ExifBody_Slongs()
			err = tmp107.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp107
		case Exif_FieldType__Srational:
			tmp108, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp109, err := thisIo.ReadBytes(int(tmp108))
			if err != nil {
				return nil, err
			}
			tmp109 = tmp109
			this._raw_data = tmp109
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp110 := NewExif_ExifBody_Srationals()
			err = tmp110.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp110
		case Exif_FieldType__Sshort:
			tmp111, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp112, err := thisIo.ReadBytes(int(tmp111))
			if err != nil {
				return nil, err
			}
			tmp112 = tmp112
			this._raw_data = tmp112
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp113 := NewExif_ExifBody_Sshorts()
			err = tmp113.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp113
		case Exif_FieldType__Utf8:
			tmp114, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp115, err := thisIo.ReadBytes(int(tmp114))
			if err != nil {
				return nil, err
			}
			tmp115 = tmp115
			this._raw_data = tmp115
			_io__raw_data := kaitai.NewStream(bytes.NewReader(this._raw_data))
			tmp116 := NewExif_ExifBody_Utf8String()
			err = tmp116.Read(_io__raw_data, this, this._root)
			if err != nil {
				return nil, err
			}
			this.data = tmp116
		default:
			tmp117, err := this.LenData()
			if err != nil {
				return nil, err
			}
			tmp118, err := thisIo.ReadBytes(int(tmp117))
			if err != nil {
				return nil, err
			}
			tmp118 = tmp118
			this._raw_data = tmp118
		}
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	_, err = thisIo.Seek(_pos, io.SeekStart)
	if err != nil {
		return nil, err
	}
	return this.data, nil
}
func (this *Exif_ExifBody_IfdField) GpsTag() (v Exif_GpsTag, err error) {
	if (this._f_gpsTag) {
		return this.gpsTag, nil
	}
	this._f_gpsTag = true
	if (this._parent.IsGpsIfd) {
		this.gpsTag = Exif_GpsTag(Exif_GpsTag(this.TagRaw))
	}
	return this.gpsTag, nil
}
func (this *Exif_ExifBody_IfdField) HasImmediateData() (v bool, err error) {
	if (this._f_hasImmediateData) {
		return this.hasImmediateData, nil
	}
	this._f_hasImmediateData = true
	tmp119, err := this.LenData()
	if err != nil {
		return false, err
	}
	this.hasImmediateData = bool(tmp119 <= 4)
	return this.hasImmediateData, nil
}
func (this *Exif_ExifBody_IfdField) LenData() (v int, err error) {
	if (this._f_lenData) {
		return this.lenData, nil
	}
	this._f_lenData = true
	tmp120, err := this.BytesPerValue()
	if err != nil {
		return 0, err
	}
	this.lenData = int(tmp120 * this.NumValues)
	return this.lenData, nil
}

/**
 * All the "IFD Pointer" tags (as the core Exif standard calls them),
 * i.e. `ExifOffset`, `InteropOffset` and `GPSInfo` (using the
 * [ExifTool's
 * names](https://exiftool.sourceforge.net/TagNames/EXIF.html)),
 * should be of type `LONG` (`field_type::long`). However, the type
 * `SLONG` (`field_type::slong`) type has also been observed:
 * <https://github.com/Exiv2/exiv2/blob/2cd987a731236037b6b78cbff897d08685a8ef49/test/data/FurnaceCreekInn.jpg>
 * 
 * Both ExifTool and Exiv2 accept `LONG`, `SLONG` and also `IFD`.
 * Exiv2 specifically supports only these three types - see
 * <https://github.com/Exiv2/exiv2/blob/2cd987a731236037b6b78cbff897d08685a8ef49/src/tiffvisitor_int.cpp#L1141>
 * (Git tag "v0.28.8"). ExifTool is more lenient - it even accepts
 * any integer type. In practice, real files most likely only use one
 * of the three types supported by Exiv2, so we stick with that.
 */
func (this *Exif_ExifBody_IfdField) SubIfd() (v *Exif_ExifBody_Ifd, err error) {
	if (this._f_subIfd) {
		return this.subIfd, nil
	}
	this._f_subIfd = true
	tmp121, err := this.Data()
	if err != nil {
		return nil, err
	}
	tmp122, err := this.Tag()
	if err != nil {
		return nil, err
	}
	tmp123, err := this.Tag()
	if err != nil {
		return nil, err
	}
	tmp124, err := this.Tag()
	if err != nil {
		return nil, err
	}
	if ( ((this.NumValues == 1) && ( ((this.FieldType == Exif_FieldType__Long) || (this.FieldType == Exif_FieldType__Ifd) || ( ((this.FieldType == Exif_FieldType__Slong) && (tmp121.(*Exif_ExifBody_Slongs).Values[0] >= 0)) )) ) && ( ((tmp122 == Exif_Tag__ExifOffset) || (tmp123 == Exif_Tag__InteropOffset) || (tmp124 == Exif_Tag__GpsInfo)) )) ) {
		thisIo := this._root._io
		_pos, err := thisIo.Pos()
		if err != nil {
			return nil, err
		}
		var tmp125 uint32;
		if (this.FieldType == Exif_FieldType__Slong) {
			tmp126, err := this.Data()
			if err != nil {
				return nil, err
			}
			tmp125 = uint32(tmp126.(*Exif_ExifBody_Slongs).Values[0])
		} else {
			tmp127, err := this.Data()
			if err != nil {
				return nil, err
			}
			tmp125 = tmp127.(*Exif_ExifBody_Longs).Values[0]
		}
		_, err = thisIo.Seek(int64(tmp125), io.SeekStart)
		if err != nil {
			return nil, err
		}
		switch this._is_le {
		case 0:
			tmp128, err := this.Tag()
			if err != nil {
				return nil, err
			}
			tmp129 := NewExif_ExifBody_Ifd(tmp128 == Exif_Tag__GpsInfo)
			err = tmp129.Read(thisIo, this, this._root)
			if err != nil {
				return nil, err
			}
			this.subIfd = tmp129
		case 1:
			tmp130, err := this.Tag()
			if err != nil {
				return nil, err
			}
			tmp131 := NewExif_ExifBody_Ifd(tmp130 == Exif_Tag__GpsInfo)
			err = tmp131.Read(thisIo, this, this._root)
			if err != nil {
				return nil, err
			}
			this.subIfd = tmp131
		default:
			err = kaitai.UndecidedEndiannessError{}
		}
		_, err = thisIo.Seek(_pos, io.SeekStart)
		if err != nil {
			return nil, err
		}
	}
	return this.subIfd, nil
}
func (this *Exif_ExifBody_IfdField) Tag() (v Exif_Tag, err error) {
	if (this._f_tag) {
		return this.tag, nil
	}
	this._f_tag = true
	if (!(this._parent.IsGpsIfd)) {
		this.tag = Exif_Tag(Exif_Tag(this.TagRaw))
	}
	return this.tag, nil
}

/**
 * Raw numeric tag. Don't read this field - access `tag` or `gps_tag`
 * instead.
 */
type Exif_ExifBody_Longs struct {
	Values []uint32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Longs() *Exif_ExifBody_Longs {
	return &Exif_ExifBody_Longs{
	}
}

func (this Exif_ExifBody_Longs) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Longs) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Longs) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp132, err := this._io.ReadU4le()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp132)
	}
	return err
}

func (this *Exif_ExifBody_Longs) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp133, err := this._io.ReadU4be()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp133)
	}
	return err
}
type Exif_ExifBody_Rational struct {
	ValueNum uint32
	ValueDen uint32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_Rationals
	_f_value bool
	value float64
	_is_le int
}
func NewExif_ExifBody_Rational() *Exif_ExifBody_Rational {
	return &Exif_ExifBody_Rational{
	}
}

func (this Exif_ExifBody_Rational) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Rational) Read(io *kaitai.Stream, parent *Exif_ExifBody_Rationals, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Rational) _read_le() (err error) {
	tmp134, err := this._io.ReadU4le()
	if err != nil {
		return err
	}
	this.ValueNum = uint32(tmp134)
	tmp135, err := this._io.ReadU4le()
	if err != nil {
		return err
	}
	this.ValueDen = uint32(tmp135)
	return err
}

func (this *Exif_ExifBody_Rational) _read_be() (err error) {
	tmp136, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.ValueNum = uint32(tmp136)
	tmp137, err := this._io.ReadU4be()
	if err != nil {
		return err
	}
	this.ValueDen = uint32(tmp137)
	return err
}

/**
 * If denominator is zero, this instance is disabled to prevent
 * `ZeroDivisionError` in Python.
 * 
 * Here's a sample file with a zero denominator in the IFD fields
 * `tag::x_resolution` and `tag::y_resolution` (both of which are of
 * type `field_type::rational`):
 * <https://github.com/python-pillow/Pillow/blob/807d689a83738027b6f6e0f219a6a6dd30e01c08/Tests/images/exif-dpi-zerodivision.jpg>
 */
func (this *Exif_ExifBody_Rational) Value() (v float64, err error) {
	if (this._f_value) {
		return this.value, nil
	}
	this._f_value = true
	if (this.ValueDen != 0) {
		this.value = float64((this.ValueNum + 0.0) / this.ValueDen)
	}
	return this.value, nil
}

/**
 * Numerator
 */

/**
 * Denominator
 */
type Exif_ExifBody_Rationals struct {
	Values []*Exif_ExifBody_Rational
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Rationals() *Exif_ExifBody_Rationals {
	return &Exif_ExifBody_Rationals{
	}
}

func (this Exif_ExifBody_Rationals) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Rationals) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Rationals) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp138 := NewExif_ExifBody_Rational()
		err = tmp138.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp138)
	}
	return err
}

func (this *Exif_ExifBody_Rationals) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp139 := NewExif_ExifBody_Rational()
		err = tmp139.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp139)
	}
	return err
}
type Exif_ExifBody_Sbytes struct {
	Values []int8
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Sbytes() *Exif_ExifBody_Sbytes {
	return &Exif_ExifBody_Sbytes{
	}
}

func (this Exif_ExifBody_Sbytes) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Sbytes) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Sbytes) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp140, err := this._io.ReadS1()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp140)
	}
	return err
}

func (this *Exif_ExifBody_Sbytes) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp141, err := this._io.ReadS1()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp141)
	}
	return err
}
type Exif_ExifBody_Shorts struct {
	Values []uint16
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Shorts() *Exif_ExifBody_Shorts {
	return &Exif_ExifBody_Shorts{
	}
}

func (this Exif_ExifBody_Shorts) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Shorts) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Shorts) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp142, err := this._io.ReadU2le()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp142)
	}
	return err
}

func (this *Exif_ExifBody_Shorts) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp143, err := this._io.ReadU2be()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp143)
	}
	return err
}
type Exif_ExifBody_Slongs struct {
	Values []int32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Slongs() *Exif_ExifBody_Slongs {
	return &Exif_ExifBody_Slongs{
	}
}

func (this Exif_ExifBody_Slongs) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Slongs) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Slongs) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp144, err := this._io.ReadS4le()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp144)
	}
	return err
}

func (this *Exif_ExifBody_Slongs) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp145, err := this._io.ReadS4be()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp145)
	}
	return err
}
type Exif_ExifBody_Srational struct {
	ValueNum int32
	ValueDen int32
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_Srationals
	_f_value bool
	value float64
	_is_le int
}
func NewExif_ExifBody_Srational() *Exif_ExifBody_Srational {
	return &Exif_ExifBody_Srational{
	}
}

func (this Exif_ExifBody_Srational) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Srational) Read(io *kaitai.Stream, parent *Exif_ExifBody_Srationals, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Srational) _read_le() (err error) {
	tmp146, err := this._io.ReadS4le()
	if err != nil {
		return err
	}
	this.ValueNum = int32(tmp146)
	tmp147, err := this._io.ReadS4le()
	if err != nil {
		return err
	}
	this.ValueDen = int32(tmp147)
	return err
}

func (this *Exif_ExifBody_Srational) _read_be() (err error) {
	tmp148, err := this._io.ReadS4be()
	if err != nil {
		return err
	}
	this.ValueNum = int32(tmp148)
	tmp149, err := this._io.ReadS4be()
	if err != nil {
		return err
	}
	this.ValueDen = int32(tmp149)
	return err
}

/**
 * If denominator is zero, this instance is disabled to prevent
 * `ZeroDivisionError` in Python.
 * 
 * Here's a sample file with a zero denominator in the IFD field
 * `tag::exposure_compensation` of type `field_type::srational`:
 * <https://github.com/drewnoakes/metadata-extractor-images/blob/651ad0e67aa8d43d358ad05f9bc07b52d8b9ac6e/jpg/Reconyx%20Hyperfire%20HP4K.jpg>
 */
func (this *Exif_ExifBody_Srational) Value() (v float64, err error) {
	if (this._f_value) {
		return this.value, nil
	}
	this._f_value = true
	if (this.ValueDen != 0) {
		this.value = float64((this.ValueNum + 0.0) / this.ValueDen)
	}
	return this.value, nil
}

/**
 * Numerator
 */

/**
 * Denominator
 */
type Exif_ExifBody_Srationals struct {
	Values []*Exif_ExifBody_Srational
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Srationals() *Exif_ExifBody_Srationals {
	return &Exif_ExifBody_Srationals{
	}
}

func (this Exif_ExifBody_Srationals) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Srationals) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Srationals) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp150 := NewExif_ExifBody_Srational()
		err = tmp150.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp150)
	}
	return err
}

func (this *Exif_ExifBody_Srationals) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp151 := NewExif_ExifBody_Srational()
		err = tmp151.Read(this._io, this, this._root)
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp151)
	}
	return err
}
type Exif_ExifBody_Sshorts struct {
	Values []int16
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Sshorts() *Exif_ExifBody_Sshorts {
	return &Exif_ExifBody_Sshorts{
	}
}

func (this Exif_ExifBody_Sshorts) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Sshorts) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Sshorts) _read_le() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp152, err := this._io.ReadS2le()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp152)
	}
	return err
}

func (this *Exif_ExifBody_Sshorts) _read_be() (err error) {
	for i := 0; i < int(this._parent.NumValues); i++ {
		_ = i
		tmp153, err := this._io.ReadS2be()
		if err != nil {
			return err
		}
		this.Values = append(this.Values, tmp153)
	}
	return err
}
type Exif_ExifBody_Utf8String struct {
	Value string
	_io *kaitai.Stream
	_root *Exif
	_parent *Exif_ExifBody_IfdField
	_is_le int
}
func NewExif_ExifBody_Utf8String() *Exif_ExifBody_Utf8String {
	return &Exif_ExifBody_Utf8String{
	}
}

func (this Exif_ExifBody_Utf8String) IO_() *kaitai.Stream {
	return this._io
}

func (this *Exif_ExifBody_Utf8String) Read(io *kaitai.Stream, parent *Exif_ExifBody_IfdField, root *Exif) (err error) {
	this._io = io
	this._parent = parent
	this._root = root
	this._is_le = this._parent._is_le


	switch this._is_le {
	case 0:
		err = this._read_be()
	case 1:
		err = this._read_le()
	default:
		err = kaitai.UndecidedEndiannessError{}
	}
	return err
}

func (this *Exif_ExifBody_Utf8String) _read_le() (err error) {
	tmp154, err := this._io.ReadBytesTerm(0, false, true, false)
	if err != nil {
		return err
	}
	this.Value = string(tmp154)
	return err
}

func (this *Exif_ExifBody_Utf8String) _read_be() (err error) {
	tmp155, err := this._io.ReadBytesTerm(0, false, true, false)
	if err != nil {
		return err
	}
	this.Value = string(tmp155)
	return err
}